(I am new to Django Rest Framework and Django in general)
I have a Beer model that looks like this:
class Beer(models.Model):
id = models.BigAutoField(primary_key=True)
name = models.CharField(max_length=255)
brewery = models.ForeignKey(Brewery, on_delete=models.CASCADE)
beer_type = models.ForeignKey(BeerType, on_delete=models.PROTECT)
class Meta:
db_table = "beer"
I then specify a BeerSerializer
like this:
class BeerSerializer(serializers.ModelSerializer):
brewery = BrewerySerializer()
beer_type = BeerTypeSerializer()
class Meta:
model = Beer
fields = ['id', 'name', 'brewery', 'beer_type']
def create(self, validated_data):
brewery_data = validated_data.pop('brewery')
beer_type_data = validated_data.pop('beer_type')
beer = Beer.objects.create(**validated_data)
beer.brewery = Brewery.objects.get_or_create(**brewery_data)
beer.beer_type = BeerType.objects.get_or_create(**beer_type_data)
return beer
And a BeerViewSet
:
class BeerViewSet(viewsets.GenericViewSet):
permission_classes = [permissions.IsAuthenticated]
serializer_class = BeerSerializer
...
def create(self, request):
pdb.set_trace()
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
(I’ve left out the list
and retrieve
implementations in the ViewSet)
When I then make a POST request from my app to /api/beers/
with the following JSON:
{
"beer_type": {
"id": 154,
"name": "Beer Type 1"
},
"brewery": {
"country": "c1",
"id": 929,
"location": "l1",
"name": "Brewery1"
},
"name": "Beer1"
}
I get an error with code 400 and error body:
{
"beer_type": {
"name": [
"beer type with this name already exists."
]
}
}
This is technically true, but what am I doing wrong if I want to allow a POST creating a new Beer object, which references an existing BeerType object (and I guess I would have the same problem with the Brewery reference)?