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