【问题标题】:django and DB modeling: I think I've got Many to Many wrongdjango 和 DB 建模:我认为我有很多错误
【发布时间】:2015-12-13 21:23:45
【问题描述】:

我有一个对象Option,它就像一个类型,它只有一个属性:name(将来可能会有更多属性)。 Option 的实例具有唯一的名称。

许多对象可能有零个或多个Option 实例。

例如:

class Consumer:
    options = models.ManyToManyField(Option, blank=True, help_text="the options")

但是,为了为Consumer 的多对多options 关系创建Option 实例,我需要创建一个新的Option 实例并将其添加到options

然而,这“打破”了我的独特性:现在我有两个同名!对于Option 的每个实例,依此类推,我为Many-to-Many 链接创建。现在我的数据库中有 68 个,而不是我需要的 4 个...

我相信我从根本上误解了Many-To-Many,和/或错误地设计了这种关系......

有人可以帮忙吗?

编辑:这是我在示例中设置选项的方式:

def enable_option(request, pk=0, option_pk=0, *args, **kwargs):
    consumer = get_object_or_404(Consumer, pk=pk)
    option = get_object_or_404(Option, pk=option_pk)

    new_option = Option()
    new_option.name = option.name // I know I am breaking my own rule...but when I read the consumer options, I need the exact same name! Still, I believe I am modeling wrong
    new_option.save()
    consumer.options.add(new_option)
    consumer.save()

    return HttpResponse()

【问题讨论】:

  • 您可以将约束添加到选项模型名称字段:name = models.CharField(unique=True)。这是保证您不会有同名的选项。当您向客户添加选项时,您可以使用 get_or_create 方法:customer.options.add(Option.objects.get_or_create(name=option_name)。在没有看到您如何向客户添加选项的情况下,我无能为力。

标签: django database many-to-many relationship data-modeling


【解决方案1】:

我真的不明白你为什么在这里创建一个新选项。你得到了现有的;您可以将其添加到关系中:

consumer = get_object_or_404(Consumer, pk=pk)
option = get_object_or_404(Option, pk=option_pk)
consumer.options.add(option)

您甚至不需要调用 save,因为修改 m2m 不会更改实例本身。

【讨论】:

  • 你说的太对了!谢谢你!我以前实际上是这样的,但是,我没有通过 id 获取选项并添加它,而是创建了新的 in_memory 对象,因此添加后它没有保存!然后,调查m2m,我发现一个例子说你需要先保存你的对象......这让我遇到了麻烦:)我现在也终于明白了django是如何管理m2m的,太棒了!因此,赞成和接受
猜你喜欢
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-17
  • 2011-01-08
  • 2015-02-12
  • 2021-02-01
相关资源
最近更新 更多