我有一个应用程序,它允许将多个板与每个客户端相关联,我可以在其中上传与客户相关的文件,以决定相关网站页面的外观。
因此,我需要建模的关系是:
- 一个客户,多个董事会; 一个
- 董事会,一个客户;
- 一块板,多个文件;
让我们专注于前两个
models.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(怎么办?
如果我将新字段设置为板类
class Board(models.Model):
[...]
client = models.ForeignKey(Client, blank = True)
当然,当我makemigrations
Django 抱怨时,因为它不知道客户端是什么,因为我在下一个模型中定义了它。
如何设计此数据库?
提前感谢您提供的任何帮助
这里的问题是你在构造之前引用了一个标识符(这里Client
((因为Board
是在Client
类之前定义的(。
Django 对此有一些支持:你可以传递包含模型名称的字符串。在同一个应用程序中,您可以只使用ClassName
,对于另一个应用程序,您可以使用other_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)
但请注意,您已经定义了从Client
到Board
的ManyToManyField
关系。尽管两种这样的关系同时存在的可能性并不常见。
如果你定义了一个从Board
到Client
的ForeignKey
关系,那么Django会自动创建一个反向关系(与related_name
(,这样some_client.my_boards
,是所有相关Board
的管理者。
我认为您可以传递模型类名而不是类本身:
class Board(models.Model):
[...]
client_id = models.ForeignKey('Client', blank=True)