簡體   English   中英

Django - 模型設計問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM