Django:在设计模型之间的关系时需要帮助吗

Django:在设计模型之间的关系时需要帮助吗,django,django-models,Django,Django Models,我有一个应用程序,可以将多个板与每个客户关联,在这些板上,我可以上传与客户相关的文件,以决定相关网站页面的外观 因此,我需要建模的关系是: 一个客户,多个董事会 一个董事会,一个客户 一块板,多个文件 让我们集中精力讨论前两个问题 型号.py class Board(models.Model): title = models.CharField(max_length=120, verbose_name="Titolo") description

我有一个应用程序,可以将多个板与每个客户关联,在这些板上,我可以上传与客户相关的文件,以决定相关网站页面的外观

因此,我需要建模的关系是:

  • 一个客户,多个董事会
  • 一个董事会,一个客户
  • 一块板,多个文件 让我们集中精力讨论前两个问题

    型号.py

    class Board(models.Model):
        title               = models.CharField(max_length=120, verbose_name="Titolo")
        description         = models.TextField()
        files               = models.FileField( null=True, blank=True, upload_to = 'clients_download_area',  verbose_name = 'Client Reserved File')
        date                = models.DateTimeField(auto_now_add=True, verbose_name = 'Data di pubblicazione')
    
        def __str__(self):
            return str(self.title)
    
    class Client(models.Model):
        name    = models.CharField(max_length=30)
        address     = models.CharField(max_length=120)
        boards  = models.ManyToManyField(Board, blank=True)
    
        def __str__(self):
            return str(self.name)
    
    好了,关系1结束了。但如果我需要知道哪个客户与董事会有关联(关系#2),该怎么办

    如果我为Board类设置一个新字段

    class Board(models.Model):
       [...]
       client               = models.ForeignKey(Client, blank = True)
    
    当然,当我
    makemigrations
    Django抱怨时,因为它不知道什么是Client,因为我在下一个模型中定义了它

    如何设计这个数据库


    提前感谢您提供的任何帮助

    我认为您可以传递模型类名,而不是类本身:

    class Board(models.Model):
       [...]    
       client_id = models.ForeignKey('Client', blank=True)
    

    我认为您可以传递模型类名,而不是类本身:

    class Board(models.Model):
       [...]    
       client_id = models.ForeignKey('Client', blank=True)
    

    这里的问题是,在构造标识符(因为
    Board
    是在
    Client
    类之前定义的)之前,您引用了标识符(此处
    Client

    Django对此有一些支持:您可以传递包含模型名称的字符串。在同一个应用程序中,您可以只使用
    ClassName
    ,对于另一个应用程序,您可以使用
    other\u app.ClassName
    ,如下所示:

    如果需要在尚未定义的模型上创建关系,则可以使用模型的名称而不是模型 对象本身:

    from django.db import models
    
    class Car(models.Model):
        manufacturer = models.ForeignKey(
            'Manufacturer',
            on_delete=models.CASCADE,
        )
        # ...
    
    class Manufacturer(models.Model):
        # ...
        pass
    
    在这里你可以这样写:

    class Board(models.Model):
        title = models.CharField(max_length=120, verbose_name="Titolo")
        description = models.TextField()
        files = models.FileField( null=True, blank=True, upload_to = 'clients_download_area',  verbose_name = 'Client Reserved File')
        date = models.DateTimeField(auto_now_add=True, verbose_name = 'Data di pubblicazione')
        client = models.ForeignKey(
            'Client',
            related_name='my_boards'
            on_delete=models.CASCADE
        )
    
        def __str__(self):
            return str(self.title)
    
    class Client(models.Model):
        name = models.CharField(max_length=30)
        address = models.CharField(max_length=120)
        boards = models.ManyToManyField(Board, blank=True)
    
        def __str__(self):
            return str(self.name)
    课程板(models.Model):
    title=models.CharField(最大长度=120,详细名称=“Titolo”)
    description=models.TextField()
    files=models.FileField(null=True,blank=True,upload\u to='clients\u download\u area',verbose\u name='Client Reserved File')
    date=models.DateTimeField(auto\u now\u add=True,verbose\u name='Data di publiblicazione')
    client=models.ForeignKey(
    “客户”,
    相关的_name='my_boards'
    on_delete=models.CASCADE
    )
    定义(自我):
    返回str(self.title)
    类客户端(models.Model):
    name=models.CharField(最大长度=30)
    地址=models.CharField(最大长度=120)
    boards=models.ManyToManyField(Board,blank=True)
    定义(自我):
    返回str(self.name)
    但是请注意,您已经定义了一个从
    客户端
    ManyToManyField
    关系。虽然有可能,但两种关系同时存在的情况并不常见


    如果您定义了从
    Board
    Client
    ForeignKey
    关系,Django会自动创建一个反向关系(与
    相关的\u名称
    ),例如
    一些\u Client.my\u boards
    ,是所有相关
    的管理者。

    这里的问题是,在构造标识符之前(因为
    是在
    客户机
    类之前定义的),您要引用标识符(这里
    客户机

    Django对此有一些支持:您可以传递包含模型名称的字符串。在同一个应用程序中,您可以只使用
    ClassName
    ,对于另一个应用程序,您可以使用
    other\u app.ClassName
    ,如下所示:

    如果需要在尚未定义的模型上创建关系,则可以使用模型的名称而不是模型 对象本身:

    from django.db import models
    
    class Car(models.Model):
        manufacturer = models.ForeignKey(
            'Manufacturer',
            on_delete=models.CASCADE,
        )
        # ...
    
    class Manufacturer(models.Model):
        # ...
        pass
    
    在这里你可以这样写:

    class Board(models.Model):
        title = models.CharField(max_length=120, verbose_name="Titolo")
        description = models.TextField()
        files = models.FileField( null=True, blank=True, upload_to = 'clients_download_area',  verbose_name = 'Client Reserved File')
        date = models.DateTimeField(auto_now_add=True, verbose_name = 'Data di pubblicazione')
        client = models.ForeignKey(
            'Client',
            related_name='my_boards'
            on_delete=models.CASCADE
        )
    
        def __str__(self):
            return str(self.title)
    
    class Client(models.Model):
        name = models.CharField(max_length=30)
        address = models.CharField(max_length=120)
        boards = models.ManyToManyField(Board, blank=True)
    
        def __str__(self):
            return str(self.name)
    课程板(models.Model):
    title=models.CharField(最大长度=120,详细名称=“Titolo”)
    description=models.TextField()
    files=models.FileField(null=True,blank=True,upload\u to='clients\u download\u area',verbose\u name='Client Reserved File')
    date=models.DateTimeField(auto\u now\u add=True,verbose\u name='Data di publiblicazione')
    client=models.ForeignKey(
    “客户”,
    相关的_name='my_boards'
    on_delete=models.CASCADE
    )
    定义(自我):
    返回str(self.title)
    类客户端(models.Model):
    name=models.CharField(最大长度=30)
    地址=models.CharField(最大长度=120)
    boards=models.ManyToManyField(Board,blank=True)
    定义(自我):
    返回str(self.name)
    但是请注意,您已经定义了一个从
    客户端
    ManyToManyField
    关系。虽然有可能,但两种关系同时存在的情况并不常见


    如果您定义了一个从
    Board
    Client
    ForeignKey
    关系,那么Django会自动创建一个反向关系(与
    相关的\u名称
    ),例如
    一些客户.my\u boards
    ,是所有相关
    Board
    的管理者。

    ok,但是,如果我需要将客户机与一个板关联,该怎么办?可能吗?即使有不同的逻辑。。谢谢你@Guillermochamorrono我怀疑我的仓促评论,给出了下面的答案。听威廉·范·昂森说,他知道自己在说什么:)好吧,但如果我需要让客户与董事会联系起来怎么办?可能吗?即使有不同的逻辑。。谢谢你@Guillermochamorrono我怀疑我的仓促评论,给出了下面的答案。听Willem Van Onsem说,他知道自己在说什么:)小注释:在Django中,
    ForeignKey
    s不以
    \u id
    后缀结尾,因为Django会自动添加一个
    fieldname\u id
    属性,该属性包含引用对象的主键的值。小注释:在Django中,
    ForeignKey
    s不以
    \u id
    后缀结尾,因为Django会自动添加一个
    fieldname\u id
    属性,该属性包含引用对象的主键值。