Python django rest框架:<;Objectname:Objectname对象>;JSON不可序列化

Python django rest框架:<;Objectname:Objectname对象>;JSON不可序列化,python,django,django-models,django-rest-framework,django-serializer,Python,Django,Django Models,Django Rest Framework,Django Serializer,我有一个客户模型和一个事件模型。事件模型指的是客户。客户有很多活动。我的要求是当我得到客户时,我需要客户的最新事件对象。当我调用customer Get API时,它显示以下错误: /api/v1/customer处的类型错误 JSON不可序列化 我的模型 class Customer(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) name =

我有一个客户模型和一个事件模型。事件模型指的是客户。客户有很多活动。我的要求是当我得到客户时,我需要客户的最新事件对象。当我调用customer Get API时,它显示以下错误:

/api/v1/customer处的类型错误

JSON不可序列化

我的模型

class Customer(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=20, unique=True)
    #some more fields to go
    def __str__(self):
        return str(self.name)


    def latest_event_name(self):
        """Return latest event """

        latest_event = self.customer_events.order_by('-event_date').last()
        return latest_event if latest_event else None



class Event(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    event_name = models.CharField(max_length=200, unique=True)

    customer = models.ForeignKey(customer_models.Customer, db_index=True, on_delete=models.SET_NULL,
                                 related_name='customer_events', null=True)
   #some more fields to go
序列化程序

class CustomerSerializer(serializers.ModelSerializer):
    latest_event_name = serializers.ReadOnlyField()

    class Meta:
        model = Customer
        fields = '__all__'

当您在中使用事件时

def latest_event_name(self): ...
您必须为事件模型创建序列化程序,因为该方法返回模型事件的实例


我认为,如果您只是将事件的id作为str返回,就不会有这个问题,因此您不必为事件模型创建seralizer。

因为您在中使用事件

def latest_event_name(self): ...
您必须为事件模型创建序列化程序,因为该方法返回模型事件的实例


我认为,如果您只是将事件的id作为str返回,就不会有这个问题,因此您不必为事件模型创建seralizer。

无论如何,现在通过以下方法解决了这个问题

def latest_event(self):
latest_event = self.customer_events.order_by('-event_date').last()
eventDict = None
if latest_event:
    eventDict = {"event_id": latest_event.id, "event_name": latest_event.event_name}
return eventDict

不确定这是否是正确的方法。

无论如何,现在通过以下方法解决了问题

def latest_event(self):
latest_event = self.customer_events.order_by('-event_date').last()
eventDict = None
if latest_event:
    eventDict = {"event_id": latest_event.id, "event_name": latest_event.event_name}
return eventDict

不确定它是否是正确的方法。

列出
事件中的其余字段
-显然其中一个字段正在阻止序列化。您要在哪里进行序列化?如果你得到一个
CustomerEvent
实例,它应该序列化成什么?@shadow-这是一个
latest\u event\u name
无法序列化的实例,因为DRF不知道如何序列化queryset resultdoes
latest\u event\u name=EventSerializer(read\u only=True)
做你想做的事吗?(您需要编写事件序列化程序)如果我在模型中使用
code返回最新的\u事件.event\u name If latest\u event else None
,则“latest\u event\u name=serializers.ReadOnlyField()”将在序列化程序中工作。它将返回事件名称。但是我需要完整的事件对象。请列出
事件中的其余字段
——显然其中一个字段正在阻止序列化。您要在哪里进行序列化?如果你得到一个
CustomerEvent
实例,它应该序列化成什么?@shadow-这是一个
latest\u event\u name
无法序列化的实例,因为DRF不知道如何序列化queryset resultdoes
latest\u event\u name=EventSerializer(read\u only=True)
做你想做的事吗?(您需要编写事件序列化程序)如果我在模型中使用
code返回最新的\u事件.event\u name If latest\u event else None
,则“latest\u event\u name=serializers.ReadOnlyField()”将在序列化程序中工作。它将返回事件名称。但是我需要完整的事件对象。我需要完整的事件对象。我需要完整的事件对象。当然,你可以这样做,基本上你是通过手动序列化对象。当然,你可以这样做,基本上你是手动序列化对象