将模型实例关联到 Django 中的 ManyToManyField
Associate model instance to ManyToManyField in Django
我是 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 实现此目的。
我知道,我必须覆盖 ASerializer
中的 create
和 update
。但是如何使用它们的 ID 将 B
的数组添加到 A
。我不想在创建 A
时创建 B
的任何新实例。想要实现这一目标,仅使用 REST Framework。
澄清:我正在为 creating/updating A
发布 B
的 ID
您不需要创建 B
的新对象。据我了解你的问题,你在覆盖 create
和 update
中获取多个 B
时遇到问题。有两种方法可以实现这一点,一种是像 this,你创建一个 query_set
然后在对象上迭代。示例:B.objects.filter(id__in=[1, 3, 4])
。
或者,您可以在方法中迭代 ID,然后获取那些 B
,然后将它们添加到 A
的 b_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
我是 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 实现此目的。
我知道,我必须覆盖 ASerializer
中的 create
和 update
。但是如何使用它们的 ID 将 B
的数组添加到 A
。我不想在创建 A
时创建 B
的任何新实例。想要实现这一目标,仅使用 REST Framework。
澄清:我正在为 creating/updating A
B
的 ID
您不需要创建 B
的新对象。据我了解你的问题,你在覆盖 create
和 update
中获取多个 B
时遇到问题。有两种方法可以实现这一点,一种是像 this,你创建一个 query_set
然后在对象上迭代。示例:B.objects.filter(id__in=[1, 3, 4])
。
或者,您可以在方法中迭代 ID,然后获取那些 B
,然后将它们添加到 A
的 b_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