Django 文件夹模型

3
我想知道如何为用户、文件和文件夹创建Django关联模型。
一个用户可以拥有多个文件和文件夹。
一个文件夹可以有很多文件,但不能在文件夹中再嵌套文件夹。
我尝试过像这样的代码(我一天前开始学习Django):
我阅读了一些Djangobook的ForeignKey和ManyToMany关系的文档,但我不确定是否完全理解了它们。

用户模型

class User_t(models.Model):
    username = models.CharField(max_length=30)
    user_id = models.CharField(max_length=30)
    pcw = models.CharField(max_length=30)
    name = models.CharField(max_length=30)
    surname = models.CharField(max_length=30)
    mail = models.EmailField(max_length=50)
    validateMail =  models.BooleanField()
    birthday = models.DateTimeField(max_length=60)
    premium = models.BooleanField()
    premiumEnd = models.DateTimeField(max_length=10)
    totalUpload = models.CharField(max_length=15)
    avatar = models.URLField()

File model

class FileItem(models.Model):
    file_id = models.CharField(max_length=30)
    file_name = models.CharField(max_length=75)
    date_upload = models.DateTimeField(max_length=10)
    data_size = models.CharField(max_length=75)
    key = models.CharField(max_length=75)
    owner_id = models.OneToManyField(User_t)
    login_accept = models.ManyToManyField(User_t)
    file_i = models.FileField(/mnt/test/)

文件夹模型

class FolderItem(models.Model):
    folder_id = models.CharField(max_length=30)
    folder_name = models.CharField(max_length=75)
    data_size = models.CharField(max_length=75)
    key = models.CharField(max_length=75)
    owner_id = models.ForeignKey(User_t)
    login_accept = models.ManyToManyField(User_t)
    files = models.ForeignKey(FileItem)

我的ForeignKey和ManyToMany的使用是正确的吗?(一个用户可以拥有多个文件和文件夹。 一个文件夹可以有很多文件,但不能在文件夹中再嵌套文件夹) - user1778354
1个回答

1

对于这种情况,您需要使用一对多的关系。因此,用户可以拥有许多文件夹,每个文件夹中可以包含许多文件。从您的示例代码中,您误解了如何编写这些类型的关系。在我解释之前,让我们退后一步,弄清楚所有这些理想情况下应该如何存储在数据库中。

您将需要三个表 - 用户、文件夹和文件。每个表内都会有许多行,使每行独特的是我们称之为主键的东西。通常这是一个整数。因此,每个用户、文件夹和文件都将在其自己的表中拥有自己独特的主键。

为了将文件包含到文件夹中,每个文件都必须存储它属于哪个文件夹。这就是外键的用途。在文件表中,将有一个名为folder的列,它将使用外键指定该文件属于哪个文件夹。例如,请考虑以下行:

id | folder | name | ...
---+--------+------+----
1  | 5      | foo  | ...

这告诉您该文件属于具有主键5的文件夹。

因此,在一对多关系中,子表必须指定它属于哪个表,而不是像您在示例代码中所做的那样由父表/模型指定。

以下是您代码的修复(除了我不知道logic_accept是用来做什么的):

class User_t(models.Model):
    username = models.CharField(max_length=30)
    user_id = models.CharField(max_length=30)
    pcw = models.CharField(max_length=30)
    name = models.CharField(max_length=30)
    surname = models.CharField(max_length=30)
    mail = models.EmailField(max_length=50)
    validateMail =  models.BooleanField()
    birthday = models.DateTimeField(max_length=60)
    premium = models.BooleanField()
    premiumEnd = models.DateTimeField(max_length=10)
    totalUpload = models.CharField(max_length=15)
    avatar = models.URLField()

class FileItem(models.Model):
    file_id = models.CharField(max_length=30)
    file_name = models.CharField(max_length=75)
    date_upload = models.DateTimeField(max_length=10)
    data_size = models.CharField(max_length=75)
    key = models.CharField(max_length=75)
    # Django will automatically create owner_id field
    owner = models.ForeignKey(User_t, related_name='files')
    folder = models.ForeignKey('FolderItem', related_name='files')
    # not sure what this (login_accept) is for...
    # login_accept = models.ManyToManyField(User_t)
    file_i = models.FileField(/mnt/test/)

class FolderItem(models.Model):
    folder_id = models.CharField(max_length=30)
    folder_name = models.CharField(max_length=75)
    data_size = models.CharField(max_length=75)
    key = models.CharField(max_length=75)
    owner = models.ForeignKey(User_t, related_name='folders')
    # again, not sure what this is for
    # login_accept = models.ManyToManyField(User_t)

login_accept 是一个用户列表,这些用户可以访问(由所有者授权)并读取(下载)该文件。 - user1778354

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接