So I am creating a notification API. I have a broad cast model and client 
model, the client model has a tag field and an operator code field. I wan 
to be able to filter by tags and operator code fields and include them to 
the broadcast serializer during creation.

class Client(models.Model):
    
    phoneRegex = RegexValidator(regex='^7[0-9]{10}$')
    phone = models.CharField(validators=[phoneRegex], max_length=11, 
unique=True)
    tag = TaggableManager()

    def __str__(self):
        return self.phone
    
    @property
    def operator_code(self):
        
        return self.phone[1:4]
    
    @property
    def time_zone(self):
        ru_number = phonenumbers.parse(self.phone, 'RU')
        time_zone = timezone.time_zones_for_number(ru_number)
        return time_zone

class Broadcast(models.Model):

    date_created = models.DateTimeField(auto_now_add=True)
    date_modified = models.DateTimeField(auto_now=True)
 
    text = models.TextField(max_length=500)
    end_date = models.DateTimeField()

    def __str__(self):
        return self.text


Serializers.py

class ClientSerializer(TaggitSerializer, serializers.ModelSerializer):
    tag = TagListSerializerField()
    time_zone = serializers.SerializerMethodField()
    operator_code = serializers.SerializerMethodField()
    class Meta:
        model = Client
        fields = '__all__'
        read_only_fields = ('date_created', 'date_modified', 
'operator_code', 'time_zone',)
    
    def validate(self, attrs):
        phone_number_exists = 
Client.objects.filter(phone=attrs['phone']).exists()

        if phone_number_exists:
            raise serializers.ValidationError(detail="phone number exists")
        
        if attrs['phone'][0] != '7':
            raise serializers.ValidationError(detail="phone number must 
start with 7")
        
        if len(attrs['phone']) != 11:
            raise serializers.ValidationError(detail="phone number must be 
11 digits")
        
        return super().validate(attrs)

    def get_operator_code(self, obj):
        return obj.operator_code

    def get_time_zone(self, obj):
        return obj.time_zone

class BroadcastSerializer(serializers.ModelSerializer):
    end_date = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S')

    class Meta:
        model = Broadcast
        fields = ['text', 'end_date',] 
        read_only_fields = ('date_created', 'date_modified', 
'filter_client',)

views.py

class ClientViewSet(viewsets.ModelViewSet):
    queryset = Client.objects.all()
    serializer_class = ClientSerializer

    def create(self, request):
        serializer = ClientSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

    def update(self, request, pk=None):
        client = get_object_or_404(Client, pk=pk)
        serializer = ClientSerializer(client, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=400)

    def destroy(self, request, pk=None):
        client = get_object_or_404(Client, pk=pk)
        client.delete()
        return Response(status=204)

class BroadcastViewSet(viewsets.ModelViewSet):
    queryset = Broadcast.objects.all()
    serializer_class = BroadcastSerializer
    filter_backends = [DjangoFilterBackend, SearchFilter]
  
    def create(self, request):
        serializer = BroadcastSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)

    def update(self, request, pk=None):
        broadcast = get_object_or_404(Broadcast, pk=pk)
        serializer = BroadcastSerializer(broadcast, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=400)

    def destroy(self, request, pk=None):
        broadcast = get_object_or_404(Broadcast, pk=pk)
        broadcast.delete()
        return Response(status=204)

-- 
You received this message because you are subscribed to the Google Groups 
"Django REST framework" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-rest-framework/334250d4-8051-4029-b541-4a8d4a7face6n%40googlegroups.com.

Reply via email to