【问题标题】:m2m relations are not displayed or saved in djangom2m 关系不显示或保存在 django 中
【发布时间】:2017-02-21 10:00:59
【问题描述】:
class A(Model):
    to_b = ManyToManyField('B', blank=True, through='AtoB')

class B(Model):
    to_a = ManyToManyField('A', blank=True, through='AtoB')

class AtoB(Model):
    a =  ForeignKey('A', on_delete=CASCADE)
    b =  ForeignKey('B', on_delete=CASCADE)
    usr =  ForeignKey(settings.USER, on_delete=CASCADE)
    # some other fields

我正在制作一个 django 应用程序。
这大致相当于我的 models.py
我需要 A 和 B 之间的 m2m 关系来通过另一个模型,因为我需要在那里存储额外的数据。
现在有一个问题 - 当我尝试在我的自定义视图中保存模型 A 的实例时,无论我是否选择它们,都不会保存与 B 实例的关系。 当我转到http://127.0.0.1:8000/admin 并尝试从那里创建 A 的实例时,我什至看不到用于选择与 B 关系的正确字段(我猜应该是 <select multiple>)强>.
有人可以解释一下为什么关系没有保存,甚至没有显示在 /admin 中吗?
这里的代码大致相当于我在views.py中的代码:

class Create(CreateView):
    model = None  # A or B
    template_name = 'something.html'

    def form_valid(self, form):
        self.object = form.save(commit=False)
        form.save()
        return HttpResponseRedirect(self.get_success_url())

在 urls.py 中,我指定了额外的参数,如下所示: views.Create.as_view(model=models.A, fields=['to_b'])

【问题讨论】:

  • 请分享您尝试创建此关系的代码。

标签: python django django-models many-to-many m2m


【解决方案1】:

这是行不通的。如果您使用自己的 ManytoMany 中间表,则必须自己手动管理和保存对象。使用 Django 的内置函数将不起作用。

保存Object A,然后保存Object B,然后将关系保存在AtoB 表中(这也是一个对象)。

a_to_b = AtoB.objects.create(a=object_a, b=object_b, user=self.request.user)
print(a_to_b)

[...] 请注意,如果您使用的是中间体 多对多关系模型,一些相关经理的 方法被禁用,因此其中一些示例不适用于此类 模型。

https://docs.djangoproject.com/en/1.10/topics/db/examples/many_to_many/

您的错误在这里解释:https://docs.djangoproject.com/en/1.10/topics/db/models/#intermediary-manytomany

【讨论】:

  • 谢谢。在这种情况下制作 m2m 字段有什么意义吗?我的意思是 to_ato_b 字段都可以简单地是 ForeignKey 到 AtoB 模型。
  • 我会使用多对多关系,以防我有两个类之间的连接需要 ObjectA 与 n ObjectsB AND 相关,反之亦然。从某种意义上说,ManyToMany 关系只是到另一个表的 ForeinKey,但 Django 提供的抽象级别更高,管理这些对象更快,痛苦更少。例如,您可以使用object_a.to_b_set.add(*QuerySet[]) 批量添加对象。我还会在这些字段中添加related_name 以使其更容易。 docs.djangoproject.com/en/1.10/ref/models/relations/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-18
  • 2016-06-07
  • 2014-08-16
  • 2023-03-13
  • 1970-01-01
相关资源
最近更新 更多