DRF - 序列化多个模型

问题描述 投票:0回答:2

请帮忙!我怎样才能获得这个JSON

{
  "value": 9998,
  "startDate": "01-03-2019T06:59",
  "endDate": "31-03-2019T23:59",
  "days": 11111111,
  "name": "Juices",
  "Stores": [
         921,
         923
    ]
  }

因为,使用我的代码我只会检索这个JSON

[
    {
        "AS400Promotion": 9998,
        "days": 11111111,
        "name": "Prueba",
        "promotionType": 999
    }
]

我该怎么做?我阅读了drf文档,但它没有用,我做错了什么?这是我的代码我的models.py

  class Store(models.Model):
     modular = models.ForeignKey(Modular, on_delete=models.CASCADE)
     store_nbr = models.IntegerField(primary_key=True, help_text="Numero 
     Tienda")
     name = models.CharField(max_length=255, help_text="Nombre de sucursal")

    def __str__(self):
         return self.name

class Campain(models.Model):
    AS400Promotion = models.IntegerField(default=9998)
    days = models.IntegerField(default=1111111)
    name = models.CharField(max_length=50)
    store = models.ForeignKey(Store, related_name='stores', on_delete=models.CASCADE)
    promotionType = models.IntegerField(default=99)

这是我的serializer.py

class StoreSerializer(serializers.ModelSerializer):

    class Meta:
        model = Store
        fields = ('modular', 'store_nbr', 'name', 'address', 'commune', 
'region', 'open_status', 'manager_name')

class CampaignSerializer(serializers.ModelSerializer):
    stores = StoreSerializer(many=True, read_only=True)
    class Meta:
        model = Campaign
        fields = ('value1', 'days', 'name', 'stores', 'promotionType')

我的viewsets.py

class CampaignViewSet(viewsets.ModelViewSet):
    queryset = Campaign.objects.all()
    serializer_class = CampaignSerializer

和我的routes.py

router.register(r'campaign', CampaignViewSet)
django python-3.x serialization django-rest-framework nested
2个回答
1
投票

这里的问题不在于DRF,您需要了解数据库关系的工作方式。我假设您有多对一关系(一个广告系列多个商店),因此外键需要在商店模型中,而不是像这样的广告系列模型

class Store(models.Model):
     campaign = models.ForeignKey(Campaign, related_name='stores', on_delete=models.CASCADE)

然后使用嵌套的序列化器,就像你已经完成的那样

class StoreSerializer(serializers.ModelSerializer):
    class Meta:
        model = Store
        fields = ('modular', 'store_nbr', 'name', 'address', 'commune', 
'region', 'open_status', 'manager_name')

class CampaignSerializer(serializers.ModelSerializer):
    stores = StoreSerializer(many=True, read_only=True)
    class Meta:
        model = Campaign
        fields = ('value1', 'days', 'name', 'stores', 'promotionType')

始终牢记嵌套序列化程序(在您的情况下为StoreSerializer)字段的名称应与模型中的related_name(在您的案例中为Store模型)匹配,以用于外键(在您的案例中为广告系列字段)


0
投票

因此,关于您在json中更改字段名称的第一个查询,请查看值示例,​​您可以以相同的方式更改其他人。

要获取序列化外键,请在CampaignSerializer中创建对象库。一个很好的例子就是Django Rest Framework writable nested serializers

我在模型中看不到start_date和end_date所以我无法对此发表评论

class CampaignSerializer(serializers.ModelSerializer):
   store = StoreSerializer(many=True, read_only=True)
   value = serializers.IntegerField(source='AS400Promotion')

class Meta:
    model = Campaign
    fields = ('value', 'days', 'name', 'store', 'promotionType')
© www.soinside.com 2019 - 2024. All rights reserved.