3

我对DJango比较陌生,我正在寻找使用来自其他框架的序列化程序将数据添加到多对多字段中。如何使用Django Rest Framework将数据添加到ManyToMany字段?

我的模型:

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) 

现在,我想将数据添加到使用REST API的用户配置模式。

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

到目前为止,我所取得的成绩:

串行:

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 

当我尝试使用这个 “人” 是空的。

观点:

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) 

我发布采购会看这样的:

{"allergies": [{"name": ["Beef"]},{"name": ["Pork"]}]} 

我一直停留在这一段时间,任何帮助,将不胜感激:)

+0

尝试以下方法: 在UserProfileSerializer创建方法,在for循环之前,明确地保存USER1 - > user1.save() – Jaakko

回答

0

夫妇的东西可以尝试:

  1. 我t可能有可能你的数据库没有一些过敏用户数据。这就是为什么你的人空了。
  2. 保存用户数据,然后添加过敏。这个很重要。
  3. 通过使用ipdb或pdb,试着了解什么样的数据表格'allergy'和'allergies_data'出来了。如果确实是你写的,那么下面的代码不应该工作。

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 
相关问题