Python django rest框架:<;Objectname:Objectname对象>;JSON不可序列化
我有一个客户模型和一个事件模型。事件模型指的是客户。客户有很多活动。我的要求是当我得到客户时,我需要客户的最新事件对象。当我调用customer Get API时,它显示以下错误: /api/v1/customer处的类型错误 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 =
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 resultdoeslatest\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 resultdoeslatest\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()”将在序列化程序中工作。它将返回事件名称。但是我需要完整的事件对象。我需要完整的事件对象。我需要完整的事件对象。当然,你可以这样做,基本上你是通过手动序列化对象。当然,你可以这样做,基本上你是手动序列化对象