Search code examples
pythondjangodjango-rest-frameworkdjango-filterdjango-filters

Filtering issue in DRF


The problem I'm having looks like: TypeError: init() got an unexpected keyword argument 'name' "GET /apartmentimages/ HTTP/1.1" 500 136691

I have such a model.py class:

class Apartment(models.Model):
    apartment_title = models.CharField(max_length=200)
    apartment_description = models.TextField()
    apartment_location = models.CharField(max_length=200)
    apartment_people_quantity = models.PositiveIntegerField()
    apartment_price = models.CharField(max_length=200)
    apartment_type = models.CharField(max_length=50, null=True)
    
    def __str__(self):
        return self.apartment_title

class ApartmentImage(models.Model):
    apartment = models.ForeignKey(Apartment, on_delete=models.CASCADE)
    image = models.ImageField(upload_to='images/', null=True, blank=True)

And serializers.py class:

    class ApartmentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Apartment
        fields = (
            'id',
            'url',
            'apartment_title', 
            'apartment_description', 
            'apartment_location', 
            'apartment_people_quantity', 
            'apartment_price',
            'apartment_type',
            )

class ApartmentImageSerializer(serializers.ModelSerializer):
    class Meta:
        model = ApartmentImage
        fields = ('id', 'url', 'apartment', 'image',)

in views.py:

    apartment_id = django_filters.CharFilter(name="apartment__id",
                                            queryset=Apartment.objects.all())

    class Meta:
        model = ApartmentImage
        fields = ('apartment_id',)

class ApartmentImageView(viewsets.ModelViewSet):
    queryset = ApartmentImage.objects.all()
    serializer_class = ApartmentImageSerializer
    filter_backends = (DjangoFilterBackend,)
    filter_class = ApartmentImageFilter

Solution

  • You have no name as an attribute in django-filters. Maybe what are you looking for is field_name and neither do you need queryset=Apartment.objects.all(). If you are looking for a field that is field_name then your CharFielter should look like this apartment_id = django_filters.CharFilter(field_name="apartment__id", lookup_expr='iexact') and maybe if you haven't overwritten the id generation it should probably be a NumberFilter() if I am not wrong.