【问题标题】:Associate model instance to ManyToManyField in Django将模型实例关联到 Django 中的 ManyToManyField
【发布时间】:2016-01-26 15:22:42
【问题描述】:

我是 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 中覆盖 createupdate。但是如何使用他们的 ID 将B 的数组添加到A。我不想在创建A 时创建B 的任何新实例。想要实现这一点,仅使用 REST 框架。

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

【问题讨论】:

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


【解决方案1】:

您不需要创建B 的新对象。据我了解您的问题,您在覆盖的createupdate 中获取多个B 时遇到问题。有两种方法可以实现这一点,一种是像this,在其中创建一个query_set,然后在对象上进行迭代。示例:B.objects.filter(id__in=[1, 3, 4])。 或者,您可以迭代方法中的 ID,然后获取那些 Bs,然后将它们添加到您的 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)

【讨论】:

    【解决方案2】:

    我也是这样实现的,感谢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
    

    【讨论】:

      猜你喜欢
      • 2019-08-01
      • 1970-01-01
      • 2021-10-22
      • 2014-05-17
      • 2016-06-05
      • 2015-02-27
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      相关资源
      最近更新 更多