[英]Django - models design issue
我正在努力在 Django(使用 PostgreSQL)上設計我的模型。
目標是創建一個組系統,用戶可以在其中安排項目。 一個項目在我的數據庫中必須是唯一的。 但是我不希望項目在我的數據庫中分組。 我想要一個屬於用戶並且可以按組排序的項目列表。
用戶擁有對象。 然后他可以將它們分組。 但他不需要這樣做。
我創建了一個屬於用戶 ( User
) 的用戶項目組 ( UserItemGroup
)。 然后,我創建了一個項目 model ( UserItem
)。 這個 model 表示用戶可以分組的項目。 項目可以同時屬於多個組,但必須是唯一的! 我在UserItem
model 中使用了 2 ForeignKey
但它看起來很奇怪......見下文:
class UserItemGroup(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
name = models.CharField(max_length=200, blank=False, null=False)
slug = models.CharField(max_length=200, blank=False, null=False)
class UserItem(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
group = models.ForeignKey(UserItemGroup, on_delete=models.CASCADE)
物品可以這樣排列:
user_x
------group_a
------------item_1
------------item_2
------------item_3
------group_b
------------item_1
------------item_4
希望我很清楚,在此先感謝您的幫助。
所以我覺得這樣的設計應該會更好:
class ItemGroup(models.Model):
# Add next line only if you want to restrict Groups to user (if they are not shared)
# user = models.ForeignKey(User, on_delete=models.CASCADE)
name = models.CharField(max_length=200)
slug = models.CharField(max_length=200)
class UserItem(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
groups = models.ManyToManyField(UserItemGroup, blank=True)
name = models.CharField(max_length=200, unique=True)
def __str__(self):
return self.name
然后你可以像這樣顯示用戶的項目:
# Get all possible groups from the user items
for group in ItemGroup.objects.filter(useritem__user=user).distinct():
print(group.name)
# Display all user items from this group
print(user.useritem_set.filter(groups=group))
# Print items that are not in a group
print(user.useritem_set.filter(groups=None))
我認為您不需要在UserItem
中使用 ForeignKey user
,因為項目是組的一部分,而組取決於用戶。
另外,您說一個項目可以屬於多個組,因此關系必須是ManyToManyField
:
class UserItem(models.Model):
group = models.ManyToManyField(UserItemGroup, blank=True)
name = models.CharField(max_length=200, unique=True)
我添加了一個name
字段並將其設置為唯一,以確保項目的唯一性。 如果項目必須是組的一部分,您可以從ManyToManyField
中刪除the blank=True
。
如果您想從用戶那里獲取所有項目,您可以執行以下操作:
UserItem.objects.filter(group__user=user).distinct()
或按組排序:
for group in user.useritemgroup_set.all():
print(group.name)
print(group.useritem_set.all())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.