How can I add data to a ManyToMany field using Django Rest Framework?
I am relatively new to DJango and I want to add data to a many-to-many field using serializers from the rest environment.
My model:
class IngFamily(models.Model):
name=models.CharField(max_length=30, unique=True, verbose_name='ingredient parent')
class UserProfile(models.Model):
user=models.ForeignKey(User)
allergies=models.ManyToManyField(IngFamily, verbose_name='allergies', null=True)
Now I want to add data to the UserProfile model using the rest of the api.
I looked around but couldn't find anything.
So far I have achieved:
serializer:
class IngFlySerializer(serializers.ModelSerializer):
class Meta:
model = IngFamily
fields= ('name',)
class UserProfileSerializer(serializers.ModelSerializer):
allergies=IngFlySerializer(many=True,)
class Meta:
model = UserProfile
fields=('allergies',)
def create(self, validated_data):
allergies_data =validated_data.pop('allergies', [])
#import pdb;pdb.set_trace()
user1=UserProfile.objects.create(**validated_data)
for allergy in allergies_data:
al=IngFamily.objects.filter(name=allergy.get('name'))
#al.name=allergy.get('name')
user1.allergies.add(al)
user1.save()
return user1
When I try to use this, "al" is empty.
View:
class user_profile(generics.ListCreateAPIView):
serializer_class = UserProfileSerializer
permission_classes = (permissions.IsAuthenticated,)
def get_queryset(self):
user = self.request.user
return UserProfile.objects.filter(user=user)
def perform_create(self, serializer):
#import pdb; pdb.set_trace()
serializer.save(user=self.request.user)
class UserDetail(generics.RetrieveDestroyAPIView):
serializer_class = UserProfileSerializer
permission_classes = (permissions.IsAuthenticated,)
def get_queryset(self):
user1 = self.request.user
return UserProfile.objects.filter(user=user1)
My request would look like this:
{"allergies": [{"name": ["Beef"]},{"name": ["Pork"]}]}
I've been stuck on this for a while, any help would be appreciated :)
+3
source to share
1 answer
There are a couple of things to try:
- Your database might not have some of the allergies coming with user data. This is why your everything comes up empty.
- saving user data before adding allergies to it. It is important.
- Using ipdb or pdb, try to figure out what form of data "allergies" and "allergies_data" appear in. If this is indeed what you wrote, there is no reason the following code should not work.
def create(self, validated_data):
allergies_data =validated_data.pop('allergies')
user1=UserProfile.objects.create(**validated_data)
user1.save()
for allergy in allergies_data:
al=IngFamily.objects.get_or_create(name=allergy['name'])
user1.allergies.add(al)
return user1
0
source to share