如何使用Django Rest Framework将数据添加到ManyToMany字段?

Rij*_*ohn 6 python django serializer manytomanyfield django-rest-framework

我是DJango的新手,我希望使用rest框架中的序列化器将数据添加到多对多字段中。

我的模特:

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)
Run Code Online (Sandbox Code Playgroud)

现在,我想使用其余的api将数据添加到UserProfile模型。

我环顾四周,但找不到任何地方。

到目前为止,我已经实现了:

序列化器:

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
Run Code Online (Sandbox Code Playgroud)

当我尝试使用它时,“ al”为空。

视图:

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)
Run Code Online (Sandbox Code Playgroud)

我的帖子请求将如下所示:

{"allergies": [{"name": ["Beef"]},{"name": ["Pork"]}]}
Run Code Online (Sandbox Code Playgroud)

我已经坚持了一段时间,任何帮助将不胜感激:)

ian*_*kit 0

可以尝试以下几件事:

  1. 您的数据库可能没有用户数据带来的一些过敏。这就是为什么你的 al 是空的。
  2. 在添加过敏之前保存用户数据。这个很重要。
  3. 通过使用 ipdb 或 pdb,尝试了解“过敏”和“过敏数据”以什么数据形式出现。如果确实是您所写的,那么以下代码就没有理由不起作用。

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
Run Code Online (Sandbox Code Playgroud)