[英]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')
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]
抱歉錯別字或簡單的缺點 - 在這里輸入
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.