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



我是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 框架实现这一点。

我知道,我必须在ASerializer中覆盖createupdate.但是如何使用B的ID添加数组来A.我不想在创建A时创建任何新的B实例。想要实现这一点,只使用 REST 框架。

澄清:我正在发布用于创建/更新AB ID

您不需要创建 B 的新对象。据我了解你的问题,你在被覆盖的createupdate中获取多个B时遇到了问题。有两种方法可以实现这一点,一种是这样的,你创建一个query_set,然后迭代对象。示例:B.objects.filter(id__in=[1, 3, 4]) .或者,您可以迭代方法中的 ID,然后获取这些 B s,然后将它们添加到Ab_associate 中。

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

ids = b_associate.split(',')
for id in ids:
    b_obj = B.objects.get(id=id)
    A.b_associate.add(b_obj)

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

最新更新