DRF-序列化多个模型

时间:2019-02-28 15:19:50

标签: django python-3.x serialization django-rest-framework nested

请帮助!我如何获取此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

和我的路线。py

router.register(r'campaign', CampaignViewSet)

2 个答案:

答案 0 :(得分:1)

这里的问题不是DRF,您需要重新研究数据库关系的工作方式。我假设您具有多对一关系(一个广告系列有很多商店),所以外键必须位于商店模型中,而不是广告系列模型中 像这样

/customers

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

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

请始终记住,嵌套序列化程序(在您的情况下为StoreSerializer)的字段名称应与模型(在您的情况下为Store模型)的模型的related_name相匹配(在您的情况下为campaign字段)

答案 1 :(得分:0)

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

要使外键序列化,请在CampaignSerializer中创建一个对象 store 。一个很好的例子在这里 Django Rest Framework writable nested serializers

在您的模型中看不到开始日期和结束日期,所以我无法对此发表评论

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')