簡體   English   中英

在 Django rest 框架中顯示外鍵鏈接模型

[英]Display foreign key linked models in Django rest framework

我想在 treeview 中展示三個模型

 Event Market
           Runner
           Runner
           Runner
      Market
           Runner
           Runner  

活動可以有多個市場,市場可以有多個跑步者。 我希望能夠從一個 api 請求中獲取這些模型,以便在必要時查看和刪除舊事件。

我嘗試創建一個組合序列化程序,但我收到一條錯誤消息,提示 url 名稱對 Runner 無效。 我認為在組合序列化程序中引用 Runner model 是不正確的,因為 Runner url 已更改為與組合相同的名稱。

{
    "events": "http://localhost:8000/api/events/",
    "markets": "http://localhost:8000/api/markets/",
    "runners": "http://localhost:8000/api/combined/",
    "balance": "http://localhost:8000/api/balance/",
    "combined": "http://localhost:8000/api/combined/"
}

go 關於這個的最佳方法是什么?

class Event(models.Model):
    sport_id = models.CharField(max_length=15)
    event_id = models.BigIntegerField(unique=True)
    event_name = models.CharField(max_length=200)
    start_time = models.DateTimeField(null=True)
    status = models.CharField(max_length=13)


class Market(models.Model):
    event = models.ForeignKey(Event, on_delete=models.CASCADE)
    market_id = models.BigIntegerField(unique=True)
    market_name = models.CharField(max_length=35)
    status = models.CharField(max_length=10)
    volume = models.FloatField(null=True)

class Runner(models.Model):
    event = models.ForeignKey(Event, null=True, default=None, on_delete=models.CASCADE)
    market = models.ForeignKey(Market, null=True, default=None, on_delete=models.CASCADE)

    runner_id = models.BigIntegerField(unique=True)
    name = models.CharField(max_length=500)
    back_odds = models.FloatField(null=True)
    lay_odds = models.FloatField(null=True)


class CombinedSerializer(serializers.ModelSerializer):
    event = EventSerializer()
    market = MarketSerializer()

    class Meta:
        model = Runner
        fields = ('id','runner_name','runner_id', 'name', 'event' ,'market')


class CombinedViewSet(mixins.ListModelMixin, 
                     viewsets.GenericViewSet, 
                     mixins.RetrieveModelMixin):

   queryset = Runner.objects.all()
   serializer_class = CombinedSerializer   

從您的 model 中,您對來自賽事和市場的跑步者有雙重依賴,兩者都是 null=True,下面的代碼用於構建樹喜歡:

event:[
    runners:[
      runnner1 (not market dependable)
      ...
      runnnerx (not market dependable)
      ]
    markets:[
        maket1:[
            runner1
            ...
            runnery
        ],
       market2:[
           ...]

串行器

class EventSerializer(serializers.ModelSerializer):

    class Meta:
        model Event
        fields: ('id','event_id', 'event_name', 'runners', 'markets')

model 在事件 class 結束時(類內)添加

def runners(self):
    runners  = Runner.objects.filter(event=self, market__isnull=True)
    return [{"runner_id": runner.runner_id, "name": runner.name} for runner in runners]

def markets(self):
    markets  = Market.objects.filter(event=self)
    return [{"market_id": market.market_id, "market_name": market.market_name, "runners":[{"runner_id": runner.runner_id, "name": runner.name} for runner in Runner.objects.filter(event=self, market=market)]} for market in markets]

視圖 - 帶有 GET(列表)選項的簡單視圖

抱歉錯別字或簡單的缺點 - 在這里輸入

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM