In my project, the relationship between Product and Group is ManytoOne.
When I tried to post a new product, it cannot work.
I’m sure there are more issues with this code and I will appreciate a detailed answer, because I am new to Django and Python. Thank you in advance.
models.py
JavaScript
x
20
20
1
class Group(models.Model):
2
productType = models.CharField(max_length=100)
3
intervalTime = models.IntegerField()
4
created = models.DateTimeField(auto_now_add=True)
5
id = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True,editable=False)
6
7
def __str__(self):
8
return self.productType
9
10
11
class Product(models.Model):
12
productName = models.CharField(max_length=255)
13
color = models.CharField(max_length=255)
14
group = models.ForeignKey(Group, on_delete=models.CASCADE)
15
created = models.DateTimeField(auto_now_add=True)
16
id = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True,editable=False)
17
18
def __str__(self):
19
return self.productName
20
serializers.py
JavaScript
1
19
19
1
class GroupSerializer(serializers.ModelSerializer):
2
class Meta:
3
model = Group
4
fields = ('id','productType','intervalTime')
5
6
7
class ProductSerializer(serializers.ModelSerializer):
8
group = GroupSerializer(many=False)
9
class Meta:
10
model = Product
11
fields = ('id','productName','color','group')
12
13
def create(self, validated_data):
14
group = validated_data.pop('group')
15
product = Product.objects.create(**validated_data)
16
for group_instance in group:
17
Group.objects.create(**group_instance, product=product)
18
return product
19
views.py
JavaScript
1
9
1
@api_view(['POST'])
2
def createProduct(request):
3
serializer = ProductSerializer(data=request.data)
4
5
if serializer.is_valid():
6
serializer.save()
7
8
return Response(serializer.data)
9
Advertisement
Answer
First change serializers.py
:
JavaScript
1
21
21
1
class GroupSerializer(serializers.ModelSerializer):
2
class Meta:
3
model = Group
4
fields = ('id','productType','intervalTime')
5
6
7
class ProductInfoSerializer(serializers.ModelSerializer):
8
group = GroupSerializer(read_only=True)
9
10
class Meta:
11
model = Product
12
fields = ('id','productName','color','group')
13
14
15
class ProductCreationSerializer(serializers.ModelSerializer):
16
group = serializers.SlugRelatedField(slug_field='productType', queryset=Group.objects.all())
17
18
class Meta:
19
model = Product
20
fields = ('productName','color','group')
21
Then change views.py
:
JavaScript
1
9
1
from rest_framework import status
2
3
@api_view(['POST'])
4
def createProduct(request):
5
serializer = ProductCreationSerializer(data=request.data)
6
serializer.is_valid(raise_exception=True)
7
instance = serializer.save()
8
return Response(status=status.HTTP_200_OK, data=ProductInfoSerializer(instance=instance).data)
9