【问题标题】:Django m2m field symmetrical to another m2m fieldDjango m2m 字段与另一个 m2m 字段对称
【发布时间】:2013-02-05 21:43:06
【问题描述】:

我想在两个不同的 m2m 字段之间进行自动关系绑定。这是我想要的工作流程的示例:

  1. 创建标签“绿色”
  2. 创建标签“Colors”并将“Green”标记为孩子
  3. 现在,当我返回“绿色”标签面板时,父母之间需要有“颜色”

不幸的是,事情没那么简单,我什么也想不出来。我尝试将对称设置为 True,但这只是造成不必要的循环(“绿色”不是“颜色”的父级!)

# my models.py
class Tag(models.Model):
    ...
    children = models.ManyToManyField(
        'self',
        blank=True,
        related_name="kids",
        symmetrical=False
    )
    parents = models.ManyToManyField(
        'self',
        blank=True,
        related_name="folks",
        symmetrical=False
    )

感谢您的帮助。

【问题讨论】:

  • 如果您引用 django 管理面板,您可能需要添加一个标签。这不是 M2M 问题。
  • 谢谢,所以我做到了。但仍然没有运气:/
  • 嗯,也许你应该研究一下表单和创建自定义表单的方法(也许扩展 ModelForm)。无论如何,这两个 M2M 是错误的。它们代表相同的东西。如果您仅在管理面板中需要此功能,您可以尝试将具有 2 个外键的新模型 Parentship 添加到 Tag 并在那里修改这些关系。
  • 谢谢,刚刚注意到您的最新评论。正如 Hamms 所建议的,我确实刮掉了一个 m2m 字段,因为它确实过于复杂。现在我正在研究管理面板表示。感谢您的建议,如果我想出最终设置,我将编辑我的开场白。

标签: python django django-models django-admin django-orm


【解决方案1】:

我相信您尝试做的事情可以通过一个 M2M 关系来完成。查看the documentation for symmetrical。如果您定义一个不对称字段,您可以使用related_name 参数来定义另一个关系:

class Tag(models.Model):
  name = models.TextField()
  children = models.ManyToManyField(
      'self',
      blank=True,
      related_name="parents",
      symmetrical=False
  )

green = Tag.objects.create(name='green')
color = Tag.objects.create(name='color')
color.children.add(green)
color in green.parents.all() # True

【讨论】:

  • 谢谢你,你拯救了一天!真的就是这么简单。知道如何代表父母管理面板吗?现在我只能看到孩子了。
  • 我相信 like this 应该适合你。
猜你喜欢
  • 2013-06-25
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多