Сериализатор Django не распознает атрибут отношения

что я пытаюсь сделать

Я создаю django API и сейчас пытаюсь запросить (GET) все фермеры (модель) из моей базы данных, но каждый раз, когда я пытаюсь это сделать, я получаю ответ, что свойство из моей модели не объявлено, хотя оно явно объявлено. Я бьюсь над этим уже несколько дней, ваша мудрость и знания по этой ситуации будут очень признательны.

Ошибка:

Exception Type: AttributeError
Exception Value:    
'Farmer' object has no attribute 'property'

models.py:

  class Farmer(AbstractUser):

    active = models.BooleanField(default=True)
    age = models.PositiveSmallIntegerField(blank=True, default=18)
    cpf = models.CharField(max_length=11, unique=True, default='')
    phone = models.CharField(blank=True, max_length=11, unique=True, default='')
    sex = models.CharField(blank=True, max_length=11, unique=False, default='')

    class Meta:
        ordering = ['id']
        verbose_name = 'farmer'
        verbose_name_plural = 'farmers'

    def __str__(self):
        return self.username

    @receiver(post_save, sender=settings.AUTH_USER_MODEL)
    def create_auth_token(sender, instance=None, created=False, **kwargs):
        if created:
            Token.objects.create(user=instance)


class Property(models.Model):

    name = models.CharField(blank=False, max_length=255)
    size = models.DecimalField(blank=False, max_digits=100, decimal_places=1)
    phone = models.CharField(blank=False, max_length=11, unique=True)
    longitude = models.DecimalField(blank=False,decimal_places=16,max_digits=1000)
    latitude = models.DecimalField(blank=False,decimal_places=16,max_digits=1000)
    
    farmer = models.ForeignKey(
        Farmer,
        related_name='property_farmer',
        on_delete=models.DO_NOTHING
    )

    class Meta:
        ordering = ['id']
        verbose_name = 'property'
        verbose_name_plural = 'properties'
        unique_together = ['id', 'farmer']

    def __str__(self):
        return f'the {self.name} property is owned by {self.farmer.username}'

serializers.py:

class FarmerSerializer(serializers.ModelSerializer):

    property = serializers.HyperlinkedRelatedField(
        many=True,
        view_name='property-detail',
        read_only=True
    )

    class Meta:
        model = Farmer
        fields = [
            'id', 'username', 'cpf', 
            'email', 'age', 'phone', 
            'sex', 'active', 'password', 'property'
        ]
        extra_kargs = {
            'cpf': {'write_only': True},
            'active': {'read_only': True}
        }

views.py:

@api_view(['GET', 'POST'])
def farmer_CR(request, format=None):

    if request.method == 'GET':
        serializer = FarmerSerializer(Farmer.objects.all(), many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)
    
    elif request.method == 'POST':
        serializer = FarmerSerializer(data=request.data)
        if serializer.is_valid():
            _saveFarmer(serializer)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else: return Response(status=status.HTTP_400_BAD_REQUEST)

    else: 
        return Response(status=status.HTTP_400_BAD_REQUEST)

вы можете использовать SerializerMethodField: https://www.django-rest-framework.org/api-guide/fields/#serializermethodfield

class FarmerSerializer(serializers.ModelSerializer):

    class Meta:
        model = Farmer
        fields = [
            'id', 'username', 'cpf', 
            'email', 'age', 'phone', 
            'sex', 'active', 'password', 'property'
        ]
        extra_kargs = {
            'cpf': {'write_only': True},
            'active': {'read_only': True}
        }
        property = serializers.SerializerMethodField()


        def get_farmers_property(self, farmer_obj):
            all_farmers_property = Property.ojbects.filter(farmer = farmer_obj)
            return all_farmers_property

У объекта 'Farmer' нет атрибута 'property', потому что у него есть 'property_farmer' :)

в вашей модели свойств вы должны:

 farmer = models.ForeignKey(
        Farmer,
        related_name='property',
        on_delete=models.DO_NOTHING
    )

Измените related_name на 'property', чтобы вы могли получить доступ к свойству как farmer.property, а не farmer.property_farmer.

Вернуться на верх