【问题标题】:django rest framework : <Objectname: Objectname object> is not JSON serializabledjango rest 框架:<Objectname: Objectname object> 不是 JSON 可序列化的
【发布时间】:2017-03-07 07:43:57
【问题描述】:

我有一个客户模型和一个事件模型。事件模型是指客户。一个客户有很多事件。我的要求是当我得到客户时,我需要客户的最新事件对象。当我调用客户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__'

【问题讨论】:

  • 列出Event 中的其余字段 - 显然其中之一正在阻止序列化。
  • 你想在哪里进行序列化?如果你得到一个CustomerEvent 实例,它应该序列化成什么?
  • @shadow - 它的 latest_event_name 不可序列化,因为 DRF 不知道如何序列化查询集结果
  • latest_event_name = EventSerializer(read_only=True) 是否符合您的要求? (您需要编写事件序列化程序)
  • 如果我在模型中使用code return latest_event.event_name if latest_event else None ,` 'latest_event_name = serializers.ReadOnlyField()' ` 将在序列化程序中工作。它将返回事件名称。但我需要完整的事件对象。

标签: python django django-models django-rest-framework django-serializer


【解决方案1】:

当您在

中使用事件时
def latest_event_name(self): ...

您必须为 Event 模型创建一个序列化程序,因为该方法返回模型 Event 的一个实例。

我认为,如果您只是将 Event 的 id 作为 str 返回,则不会有这个问题,因此您不必为 Event 模型创建序列化程序。

【讨论】:

  • 我需要完整的事件对象
【解决方案2】:

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

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

不确定它是否正确。

【讨论】:

  • 当然可以,基本上是手动序列化对象
猜你喜欢
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
  • 2015-10-29
  • 2021-06-18
  • 2020-07-05
  • 1970-01-01
  • 2021-12-03
  • 2019-09-28
相关资源
最近更新 更多