【发布时间】: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