django 和 DB 建模:我想我有很多错误
django and DB modeling: I think I've got Many to Many wrong
我有一个对象 Option
就像一个类型,它只有一个 属性: name
(将来它可能有更多的属性)。
Option
的实例具有唯一的名称。
许多对象可能有零个或多个 Option
个实例。
例如:
class Consumer:
options = models.ManyToManyField(Option, blank=True, help_text="the options")
但是,为了为 Consumer
的多对多 options
关系创建 Option
实例,我需要创建一个新的 Option
实例并将其添加到 options
.
这可是"breaks"我的独特之处:现在我有两个同名的! Option
I create.for Many-to-Many
链接的每个实例依此类推。我的数据库中现在有 68 个,而不是我需要的 4 个...
我相信我从根本上误解了 Many-To-Man
y,和/或错误地设计了这种关系...
有人可以帮忙吗?
编辑:这是我在示例中设置选项的方式:
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()
我不太明白你为什么要在这里创建一个新的选项。你得到现有的;您可以将其添加到关系中:
consumer = get_object_or_404(Consumer, pk=pk)
option = get_object_or_404(Option, pk=option_pk)
consumer.options.add(option)
您甚至不需要调用 save
,因为修改 m2m 不会更改实例本身。
我有一个对象 Option
就像一个类型,它只有一个 属性: name
(将来它可能有更多的属性)。
Option
的实例具有唯一的名称。
许多对象可能有零个或多个 Option
个实例。
例如:
class Consumer:
options = models.ManyToManyField(Option, blank=True, help_text="the options")
但是,为了为 Consumer
的多对多 options
关系创建 Option
实例,我需要创建一个新的 Option
实例并将其添加到 options
.
这可是"breaks"我的独特之处:现在我有两个同名的! Option
I create.for Many-to-Many
链接的每个实例依此类推。我的数据库中现在有 68 个,而不是我需要的 4 个...
我相信我从根本上误解了 Many-To-Man
y,和/或错误地设计了这种关系...
有人可以帮忙吗?
编辑:这是我在示例中设置选项的方式:
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()
我不太明白你为什么要在这里创建一个新的选项。你得到现有的;您可以将其添加到关系中:
consumer = get_object_or_404(Consumer, pk=pk)
option = get_object_or_404(Option, pk=option_pk)
consumer.options.add(option)
您甚至不需要调用 save
,因为修改 m2m 不会更改实例本身。