Django Rest Framework: TypeError: Объект типа Facility не является JSON сериализуемым

Когда я пытаюсь отправить запрос put в конечную точку LeadUpdate Api, я получаю следующую ошибку:

Django Rest Framework: TypeError: Object of type Facility is not JSON serializable

Может ли кто-нибудь объяснить мне, почему это так? Этот сериализатор в основном должен сохранять назначенные объекты в лиде, когда лид обновляется, и создавать объект "LeadFacilityAssociation", если какие-либо идентификаторы объектов будут отправлены с IntegerField.

serializer.py

class LeadUpdateSerializer(serializers.ModelSerializer):
    is_owner = serializers.SerializerMethodField()
    assigned_facilities = serializers.IntegerField(required=False)
    scheduled_datetime = serializers.DateTimeField(required=False)

    class Meta:
        model = Lead
        fields = (
            "id",
            "assigned_facilities",
            "scheduled_datetime",
            "is_owner",
        )
        read_only_fields = ("id", "is_owner")

    def get_is_owner(self, obj):
        user = self.context["request"].user
        return obj.agent == user

    def create(self, validated_data):
        assigned_facilities = validated_data.pop("assigned_facilities")
        scheduled_datetime = validated_data.pop("scheduled_datetime")
        instance = Lead.objects.create(**validated_data)
        instance.LeadFacilityAssociation.create(assigned_facilities=assigned_facilities,scheduled_datetime=scheduled_datetime)
        return instance
        
    def to_representation(self, instance):
        representation = super().to_representation(instance)

        representation["scheduled_datetime"] = instance.LeadFacilityAssociation.first().scheduled_datetime
        representation["assigned_facilities"] = instance.LeadFacilityAssociation.first().assigned_facilities
        print(instance.LeadFacilityAssociation.first().assigned_facilities)
        return representation

models.py

class Facility(models.Model):

    name = models.CharField(max_length=150, null=True, blank=False)
  
    def __str__(self):
        return self.Name


class Lead(models.Model):
    first_name = models.CharField(max_length=40, null=True, blank=True)
    last_name = models.CharField(max_length=40, null=True, blank=True)

    def __str__(self):
        return f"{self.first_name} {self.last_name}"


class LeadFacilityAssociation(models.Model):
    assigned_facilities = models.ForeignKey(Facility,  related_name='LeadFacilityAssociation')
    lead = models.ForeignKey(Lead,  related_name='LeadFacilityAssociation')
    scheduled_datetime = models.DateTimeField(null=True, blank=True)

plz исправьте эту опечатку

In Facility Model in __str__ do correct self.name insted of self.Name

class Facility(models.Model):

    name = models.CharField(max_length=150, null=True, blank=False)
  
    def __str__(self):
        return self.name

Проблема заключается в методе to_representation для сериализатора.

def to_representation(self, instance):
        representation = super().to_representation(instance)

        representation["scheduled_datetime"] = instance.LeadFacilityAssociation.first().scheduled_datetime
        representation["assigned_facilities"] = instance.LeadFacilityAssociation.first().assigned_facilities
        print(instance.LeadFacilityAssociation.first().assigned_facilities)
        return representation

Проблема в том, что в этой части representation["assigned_facilities"] = instance.LeadFacilityAssociation.first().assigned_facilities возвращается экземпляр назначенного объекта, а, как говорится в сообщении об ошибке, экземпляры не являются сериализуемыми в JSON. Что вы можете сделать, так это присвоить representation["assigned_facilities"] назначенным объектам name или id следующим образом:

def to_representation(self, instance):
        representation = super().to_representation(instance)

        representation["scheduled_datetime"] = instance.LeadFacilityAssociation.first().scheduled_datetime
        # You can use the name or whatever field fits similar to what you have above
        representation["assigned_facilities"] = instance.LeadFacilityAssociation.first().assigned_facilities.id
        print(instance.LeadFacilityAssociation.first().assigned_facilities)
        return representation
Вернуться на верх