Django DRF-序列化多个模型

Django DRF-序列化多个模型,django,python-3.x,serialization,django-rest-framework,nested,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 ] } [ { "AS400Promotion": 9998, "days

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

{
  "value": 9998,
  "startDate": "01-03-2019T06:59",
  "endDate": "31-03-2019T23:59",
  "days": 11111111,
  "name": "Juices",
  "Stores": [
         921,
         923
    ]
  }
[
    {
        "AS400Promotion": 9998,
        "days": 11111111,
        "name": "Prueba",
        "promotionType": 999
    }
]
因为,在我的代码中,我只检索这个JSON

{
  "value": 9998,
  "startDate": "01-03-2019T06:59",
  "endDate": "31-03-2019T23:59",
  "days": 11111111,
  "name": "Juices",
  "Stores": [
         921,
         923
    ]
  }
[
    {
        "AS400Promotion": 9998,
        "days": 11111111,
        "name": "Prueba",
        "promotionType": 999
    }
]
我怎么做?我读了drf文档,但它不起作用,我做错了什么? 这是我的密码 我的模特

  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')
my viewsets.py

class CampaignViewSet(viewsets.ModelViewSet):
    queryset = Campaign.objects.all()
    serializer_class = CampaignSerializer
还有我的路线

router.register(r'campaign', CampaignViewSet)

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

要序列化外键,请在序列化程序中创建对象存储。这里有一个很好的例子

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

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

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

要序列化外键,请在序列化程序中创建对象存储。这里有一个很好的例子

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

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

这里的问题不是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)字段的名称应与外键(在您的案例中为campaign字段)的模型(在您的案例中为Store model)中的相关名称相匹配。

这里的问题不在于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)字段的名称应与外键(案例中为campaign字段)的模型(案例中为Store model)中的相关名称相匹配