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







All Articles