gpt4 book ai didi

python - Django 休息框架。返回嵌套的多个模型

转载 作者:行者123 更新时间:2023-12-01 06:50:55 25 4
gpt4 key购买 nike

我正在尝试创建一个组合 View 集,以嵌套格式显示来自三个 django 模型的数据。

当我尝试返回 View 集时收到错误。

尝试在序列化器“CombinedSerializer”上获取字段“runner”的值时出现 AttributeError。
序列化器字段可能命名不正确,并且与“Runner”实例上的任何属性或键不匹配。
原始异常文本为:“Runner”对象没有属性“runner”。

序列化器.py

class CombinedSerializer(serializers.Serializer):
event = EventSerializer()
market = MarketSerializer()
runner = RunnerSerializer()
class Meta:
fields = ('event' , 'market', 'runner')

View .py

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

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

模型.py

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)

由于某种原因,当我从序列化器事件和市场中删除运行者时,它以嵌套格式显示在我的 api 中。当我添加 Runner 时,出现上述错误。我怎样才能解决这个问题并在我的 API 中显示所有三个?

最佳答案

quesrysetViewSet包含Runner实例:

queryset = Runner.objects.all()

但是在 CombinedSerializer您已包含 runner字段(映射到 RunnerSerailizer )——您已经有一个 Runner模型实例,这样你就没有 runner那里的字段,您只有 Runner 中可用的字段模型、任何反向相关字段以及您在序列化器上添加的自定义字段。

<小时/>

您有几个选择:

继承自ModelSerializer并包括所有字段:

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

class Meta:
model = Runner
fields = '__all__'

或者,如果您想要对字段进行更精细的控制,请明确提及字段(在这种情况下,您可以保留 Serializer 继承),例如:

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

class Meta:
fields = ('event', 'market', 'name', 'back_odds')

如果你想继承serializers.ModelSerializer ,您需要在 Meta 中提及型号类:

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

class Meta:
model = Runner
fields = ('event', 'market', 'name', 'back_odds')

关于python - Django 休息框架。返回嵌套的多个模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59006151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com