代码之家  ›  专栏  ›  技术社区  ›  Rohit Arya

将模型实例关联到Django中的ManyToManyField

  •  0
  • Rohit Arya  · 技术社区  · 8 年前

    我是Django的新手。我做了两个这样的模型:

    class A(models.Model):
        title = models.CharField(max_length=255, null=False)
        created = models.DateTimeField(auto_now_add=True)
        updated = models.DateTimeField(auto_now_add=False, null=True)
        b_assigned = models.ManyToManyField(B, related_name='b_assigned')
    
        class Meta:
           db_table = 'a_table'
    
    
    class B(models.Model):
        name = models.CharField(max_length=255, null=False)
        created = models.DateTimeField(auto_now_add=True)
        updated = models.DateTimeField(auto_now_add=False, null=True)
    
        class Meta:
           db_table = 'b_table'
    

    各个类的序列化程序为:

    class ASerializer(serializers.ModelSerializer):
        b_assigned = BSerializer(many=True, required=True)
        class Meta:
           model = A
           fields = ('id', 'title', 'b_assigned')
           read_only_fields = ('id',)
    
    class BSerializer(serializers.ModelSerializer):
        class Meta:
           model = B
           fields = ('id', 'name')
           read_only_fields = ('id',)
    

    我已经有几件物品了 B 在数据库中。 现在创建一个对象 A ,我必须提供 B . 如何使用Django REST框架实现这一点。

    我知道,我必须超越 create update 在里面 ASerializer 。但是如何添加数组 B 使用他们的ID A. 。我不想创建的任何新实例 B 创建时 A. 。想要实现这一点,请仅使用REST框架。

    澄清:我正在发布的ID B 用于创建/更新 A.

    2 回复  |  直到 8 年前
        1
  •  2
  •   Abhishek    8 年前

    不需要创建的新对象 B 就我所能理解的你的问题而言,你在获得多个 B 在重写的 create update 实现这一点有两种方法,一种是 this ,在其中创建 query_set 然后对对象进行迭代。例子: B.objects.filter(id__in=[1, 3, 4]) . 或者,您可以迭代方法中的ID,然后获取这些ID B s,然后将它们添加到您的 A b_associate .

    我希望你的 POST 要求

    ids = b_associate.split(',')
    for id in ids:
        b_obj = B.objects.get(id=id)
        A.b_associate.add(b_obj)
    
        2
  •  1
  •   Community Ian Goodfellow    7 年前

    我也做到了,谢谢 Abhishek 指导我:

    def create(self, validated_data):
        a = A.objects.create(**validated_data)
        a.save()
        ids = self.initial_data['b_assigned'].split(',')
        bs = B.objects.filter(id__in=ids)
        for b in bs:
            a.b_assigned.add(b)
        return a