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