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'の残りのフィールドをリストしてください - そのうちの1つが直列化を妨げていることは明らかです。 – arvindch

+0

ここで連載をしようとしていますか?あなたが 'CustomerEvent'インスタンスを取得した場合、それはどのようなものに直列化されますか? – Sayse

+0

@shadow - DRFはクエリーセットの結果をシリアライズする方法がないので、シリアライズできない 'latest_event_name'です。 – Sayse

答えて

2

あなたは

def latest_event_name(self): ... 
でイベントを使用していると

シリアライザを作成する必要がありますそのイベント・モデルは、そのモデル・イベントのインスタンスを戻すためです。

イベントのIDをstrとして返すだけであれば、この問題は発生しないので、イベントモデルのためのセリライザーを作成する必要はありません。

+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

もちろん、あなたはそれを行うことができます。基本的には、オブジェクトを手作業で直列化しています –

関連する問題