将模型实例与Django中的ManyToManyField相关联

时间:2016-01-25 18:41:53

标签: python django django-rest-framework django-serializer

我是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 Framework实现这一目标。

我知道,我必须覆盖create中的updateASerializer。但是如何使用ID B添加A数组。在创建B时,我不想创建A的任何新实例。想要实现这一点,仅使用REST Framework。

澄清:我发布了B的ID,用于创建/更新A

2 个答案:

答案 0 :(得分:2)

您无需创建HTTP POST https://www.googleapis.com/youtube/v3/subscriptions?part=snippet&key={YOUR_API_KEY} 的新对象。据我所知,您在覆盖的BB中获得多个create时遇到问题。有两种方法可以实现此目的,一种方法类似于this,您可以在其中创建update然后迭代对象。示例:query_set。 或者,您可以迭代方法中的ID,然后获取B.objects.filter(id__in=[1, 3, 4])个,然后将其添加到B的{​​{1}}中。

我希望您在A请求中有b_associate。

b_associate

答案 1 :(得分:1)

我实现了同样的目标,感谢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