1

我想知道如何为用户、文件夹、文件创建 django 关系模型

一个用户可以有多个文件和文件夹。

一个文件夹可以有很多文件,但不能有文件夹 int 文件夹。

我尝试过类似的方法(我一天前开始学习 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()

档案模型

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)
4

1 回答 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)
于 2012-10-26T22:42:47.817 回答