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



我有一个应用程序,它允许将多个板与每个客户端相关联,我可以在其中上传与客户相关的文件,以决定相关网站页面的外观。

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

  1. 一个客户,多个董事会;
  2. 一个
  3. 董事会,一个客户;
  4. 一块板,多个文件;

让我们专注于前两个

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)

当然,当我makemigrationsDjango 抱怨时,因为它不知道客户端是什么,因为我在下一个模型中定义了它。

如何设计此数据库?

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

这里的问题是你在构造之前引用了一个标识符(这里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)

但请注意,您已经定义了从ClientBoardManyToManyField关系。尽管两种这样的关系同时存在的可能性并不常见。

如果你定义了一个从BoardClientForeignKey关系,那么Django会自动创建一个反向关系(与related_name(,这样some_client.my_boards,是所有相关Board的管理者。

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

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

最新更新