1

ユーザー、フォルダー、ファイルのdjangoリレーションモデルの作成方法を知りたい

ユーザーは複数のファイルとフォルダーを持つことができます。

フォルダーには多くのファイルを含めることができますが、フォルダー int フォルダーを含めることはできません。

私はそのようなことを試しました(私は1日前に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

このような場合は、1 対多の関係を使用する必要があります。したがって、ユーザーは多くのフォルダーを持つことができ、各フォルダーはその中に多くのファイルを持つことができるという考えです。サンプル コードから、これらのタイプの関係をコーディングする方法を誤解しています。それを説明する前に、一歩下がって、理想的にはこれらすべてを db に格納する方法を考えてみましょう。

ユーザー、フォルダー、ファイルの 3 つのテーブルが必要です。各テーブルには内部に多くの行があり、各行を一意にするのは、主キーと呼ばれるものです。通常、これは整数です。したがって、各ユーザー、フォルダー、およびファイルは、独自のテーブル内に独自の一意の主キーを持ちます。

ファイルをフォルダーに含めるには、各ファイルが属するフォルダーに保存する必要があります。ここで外部キーが使用されます。ファイルテーブル内にはfolder、外部キーを使用してファイルが属するフォルダーを指定する列があります。たとえば、次の行を考えてみます。

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

これは、ファイルが主キーを持つフォルダーに属していることを示しています5

したがって、1 対多の関係では、子テーブルは、コード例のように親テーブル/モデルではなく、それが属するテーブルを指定する必要があります。

以下はあなたのコードの修正です(何のためにあるのかわからないことを除い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 に答える