Как РАЗМЕСТИТЬ несколько объектов в одном запросе JSON?

#django #django-rest-framework

Вопрос:

Я использую django-rest-фреймворк и недавно столкнулся с проблемой. Мне нужно отправить такой запрос и создать 2 объекта:

 {
    "lease": 28,
    "date": [
        {
            "from_date": "2021-06-01",
            "until_date": "2021-07-01"
        },
        {
            "from_date": "2022-03-22",
            "until_date": "2022-04-23"
        }
    ]
}
 

Модель выглядит так:

 class DateUnavailable(models.Model):
    lease = models.ForeignKey(Lease, on_delete=models.CASCADE, blank=False, null=False)
    from_date = models.DateField(blank=True, null=True)
    until_date = models.DateField(blank=True, null=True)
 

Как этого можно достичь? Я попробовал сериализатор(много=верно) в views.py, но это не работает

Комментарии:

1. Можете ли вы показать свои взгляды и свои сериализаторы

Ответ №1:

У меня была та же проблема, что и у вас, тогда я создал модель, в которой поля указаны как a ManyToManyField() , чтобы разрешить создание нескольких вложенных полей:

Имейте в виду, что формы DRF по умолчанию не допускают нескольких записей. Вам нужно будет передать их непосредственно в формате json.

Модели

 class ProfileProperty(models.Model):
    gender = models.CharField(....)
    height = models.DecimalField(..)
    width = models.DecimalField(...)
    
    ....
 
class Profile(models.Model):
    name = models.CharField(User, on_delete=models.CASCADE)
    property = models.ManyToManyField(ProfileProperty) # <------------------------
 
    def __str__(self):
        return self.name
 

Сериализаторы

 imports ...
 
Class ProfilePropertySerializer(serializer.ModelSerializer):
 
    class Meta:
        model = ProfileProperty
        fields = "__all__"
 
 
Class ProfileSerializer(serializer.ModelSerializer):
 
    property = ProfilePropertySerializer(many=True)
 
    class Meta:
        model = Profile
        fields = "__all__"
 
    def create(self, validate_data):
        # get the value from the payload.
        properties = validated_data.pop('property')
 
        # Add (all) the value from payload to the Profile model.
        profile_instance = Profile.objects.create(**validated_data)
 
        # Loop the values that were passed inside of property fields from payload.
        for property in properties:
           # Add normally the fields of "this payload" to the Property model.
           property_instance = Property.objects.create(**property)
           
           # Here is where the magic begins:
           # Get the property_instance and passes all the payloads.id.
           # and add them to profile-instance as it should be.
           profile_instance.property.add(property_instance.id)
           
           # save the values.
           profile_instance.save()
 
           return profile_instance
 
    def update(self, instance, validate_data):
        # do alsome stuff here... ;)
 
 

Полезная нагрузка

 [
 {
  "id":1,
  "name":"John Smith",
  "property":[
        {
         "gender":"Male",
         "height": 1.72,
         "width":null
         },
         {
         "gender":"Male",
         "height": 1.90,
         "width":null
         },
         {
         "gender":"Male",
         "height": 1.72,
         "width":null
         },
       ]
    }
]
 

Ответ №2:

Сделайте свою полезную нагрузку массивом JSON. Он должен работать с many=True

 [
    {
        "lease": 28,
        "from_date": "2021-06-01",
        "until_date": "2021-07-01"
    },
    {
        "lease": 28,
        "from_date": "2022-03-22",
        "until_date": "2022-04-23"
    }
]