#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"
}
]