DRF - Сериализация нескольких моделей - PullRequest
0 голосов
/ 28 февраля 2019

пожалуйста, помогите!Как я могу получить этот 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, но она не сработала, что я делаю не так?вот мой код my 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

и мой rout.py

router.register(r'campaign', CampaignViewSet)

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Проблема здесь не в 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 в вашей модели (модель магазина в вашем случае) для внешнего ключа (поле кампании в вашем случае)

0 голосов
/ 28 февраля 2019

Итак, что касается вашего первого запроса об изменении имени поля в json, посмотрите на пример значения, вы можете изменить другие таким же образом.

Для сериализации внешнего ключа создайте объект store в CampaignSerializer.Хороший пример здесь Django Rest Framework записываемые вложенные сериализаторы

Я не вижу 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')
...