Нужно добавить поля одной модели в сериализаторы другой модели, но при POST-запросе возникает ошибка
models.py
class Product(models.Model):
product_id = models.AutoField(unique=True, primary_key=True)
product_name = models.CharField(max_length=255)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
db_table = "product_master"
def __str__(self):
return self.product_name
class Organisation(models.Model):
"""
Organisation model
"""
org_id = models.AutoField(unique=True, primary_key=True)
org_name = models.CharField(max_length=100)
org_code = models.CharField(max_length=20)
org_mail_id = models.EmailField(max_length=100)
org_phone_number = models.CharField(max_length=20)
org_address = models.JSONField(max_length=500, null=True)
product = models.ManyToManyField(Product, related_name='products')
org_logo = models.ImageField(upload_to='org_logo/')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
db_table = "organisation_master"
def __str__(self):
return self.org_name
serializers.py
class Product_Serializers(serializers.ModelSerializer):
class Meta:
model = Product
fields = ('product_id', 'product_name',)
class Organisation_Serializers(serializers.ModelSerializer):
product = Product_Serializers(many=True)
class Meta:
model = Organisation
fields = ('org_id', 'org_name', 'org_address', 'org_phone_number', 'org_mail_id','org_logo','org_code','product')
depth = 1
<
{
"status": "error",
"code": 400,
"data": {
"product": [
"This field is required."
]
},
"message": "success"
}
<
Можете ли вы, пожалуйста, предложить мне способ, так как я пробовал много способов в соответствии с моими знаниями, но это не работает.
Если вы используете кортеж для полей, поставьте запятую после product в ваших полях. Если вы используете список, то не ставьте запятую в конце
fields = ('org_id', 'org_name', 'org_address', 'org_phone_number', 'org_mail_id','org_logo','org_code','product',)
depth = 1
Обновите ваши сериализаторы до:
class Organisation_Serializers(serializers.ModelSerializer):
class Meta:
model = Organisation
fields = ('org_id','org_name','org_address','org_phone_number','org_mail_id','org_logo','org_code','product',)
Обновите свои представления следующим образом:
class Organisation_Viewset(DestroyWithPayloadMixin,viewsets.ModelViewSet):
renderer_classes = (CustomRenderer, ) #ModelViewSet Provides the list, create, retrieve, update, destroy actions.
queryset=models.Organisation.objects.all()
parser_classes = [MultiPartParser, FormParser]
serializer_class=serializers.Organisation_Serializers
def create(self, request, *args, **kwargs):
data = request.data
serializer = Organisation_Serializers(data)
serializer.is_valid(raise_exceptions=True)
serializer.save()
return Response(serializer.data)
Теперь мы можем отправить id как массив для create api:
curl -XPOST \
-H [authentication]
http://localhost:8000/some/api/url
-d '{"org_name": "hero", "product": [1,2]}'