0

我有一個客戶模型和一個事件模型。事件模型是指客戶。客戶有很多事件。我的要求是當我得到客戶時,我需要客戶的最新事件對象。當我撥打客戶獲取API,它顯示了以下錯誤,django rest framework:<Objectname:Objectname object>不是JSON可序列化的

TypeError at /api/v1/customer 
<Event: Event object> is not JSON serializable 

我的模型

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__' 
+0

名單'Event'領域的休息 - 其中明確一個是防止序列化。 – arvindch

+0

你在哪裏試着做序列化?如果你得到一個'CustomerEvent'實例,它應該序列化成什麼? – Sayse

+0

@shadow - 它是不可序列化的'latest_event_name',因爲DRF不知道如何序列化查詢集結果 – Sayse

回答

2

正如你在

def latest_event_name(self): ... 
使用活動

你必須爲t創建一個序列化器他是Event模型,因爲該方法返回模型Event的一個實例。

我認爲,如果你只是將事件的id作爲str返回,你就不會有這個問題,所以你不必爲Event模型創建seralizer。

+0

我需要完整的事件對象 –

0

反正現在通過下面的方法解決了該問題。

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 

不知道它的正確方法與否。

+0

當然,你可以這樣做,基本上你是手動序列化對象 –