我有一个设置,我有几个模型其中两个是Option
和Project
。 Options
代表我的应用程序中几个字段的选择选项,并存储大约1000(默认)值。我现在想要达到的是Projects
可以有自己的一套Options
,这意味着当他们开始一个新的Project
时,他们将看到默认的选项集。然而他们可以删除一些选项,然后将不会显示在他们的项目(但留在数据库中)以及添加自定义选项到他们的项目(其他人不应该能够看到)。常见用例是用户可能希望保留默认Options
的99%,以便它们将删除10并可能添加10.Django模型多对多替代
如何为描述的案例建模?我是否需要创建一个ManyToMany字段Project <-> Option
,我将在创建项目时填充所有Options
,或者是否有更好,更省空间的方式可供您考虑,例如:以某种方式存储删除的ID在某处,并找到一种方法来显示默认Options
+项目特定Options
?
我的模型,像这样:
class Option(models.Model):
creator = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="selectoptions", blank=True, null=True)
created = models.DateField(auto_now_add=True)
deleted = models.BooleanField(default=False)
name = models.CharField(max_length=255)
#we can have nested selectoptions
parent = models.ForeignKey('self', blank=True, null=True, related_name='children', db_index=True)
class Project(models.Model):
name = models.CharField(max_length=200)
users = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='projects')
问题是,当我创建一个新的项目时,我总是要做:'selectOptions = Option.objects.all()newProject.options.add(* selectOptions)'这将是一个巨大的开销,因为它会为所有项目创建数据库条目。我希望以某种方式存储已删除的selectoptions的ID,并且可能只接收来自默认项目的selectOptions +当前项目的selectOptions – niklas
我可以知道这是一个问题吗?以及为什么你必须做newProject.options.add(* selectOptions)。看,选项是独立的实体。当你创建一个newProject时,它不会有任何选项吗?所以,它的M2M选项领域不会有任何东西。只有当用户选择添加该选项时才填充它。 –
当你做newProject.options.add(* selectOptions)时,你不必要地用选项填充newProject,然后让用户删除不需要的,当它应该像让用户添加/删除任何他想要的。 –