我有一個設置,我有幾個模型其中兩個是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,然後讓用戶刪除不需要的,當它應該像讓用戶添加/刪除任何他想要的。 –