django - Django 多对一
问题描述
我正在尝试在 Django 中创建一个简单的待办事项应用程序。我很难理解外键的概念。每个项目都假设有多个公寓,每个公寓应该有多个任务。
楷模:
# Project model
class Project(models.Model):
name = models.CharField(_("Name"), max_length=30)
city = models.CharField(_("City"), max_length=30)
street = models.CharField(_("Street"), max_length=30)
number = models.IntegerField(_("Number"), max_length=4)
ZIP = models.ImageField(_("ZIP"), max_length=10)
manager = models.CharField(_("Manager"), choices=managers, default='ariel')
# Apartments
apartment = models.ForeignKey(_("Apartment"), Apartment, on_delete=models.CASCADE)
def __repr__(self):
return "{}".format(self.name)
# Apartment model
class Apartment(models.Model):
building = models.CharField(_("Building"), max_length=4)
floor = models.CharField(_("Floor"), max_length=4)
number = models.CharField(_("Number"), max_length=4)
type = models.CharField(_("Type"), max_length=4)
upgraded = models.BooleanField(_("Upgraded"), default=False)
drawing = models.FileField(_("Drawing"), upload_to=None)
notes = models.TextField(_("Notes"), max_length=500)
status = models.BooleanField(_("Completed"), default=False)
# Tasks
airTunnels = models.ForeignKey(_("Air Tunnels"), Task, on_delete=models.CASCADE)
gasPipelines = models.ForeignKey(_("Gas Pipelines"), Task, on_delete=models.CASCADE)
def __repr__(self):
return "{} - {}".format(self.number, self.status)
# Task model
class Task(models.Model):
title = models.CharField(_("Task"), max_length=30)
doneBy = models.CharField(_("Done By"), choices=workers, default='daniel')
date = models.DateTimeField(_("Date"), default=timezone.now())
def __repr__(self):
return "{}".format(self.title)
解决方案
如果使用apartment = models.ForeignKey(_("Apartment"), Apartment, on_delete=models.CASCADE)
,则表示每个项目只有一间公寓。所以你必须为每间公寓定义不同的项目。如果您的每间公寓只能有一个项目,则必须在公寓模型中定义外键,如下所示:
class Apartment(models.Model):
#...your other fields
project = models.ForeignKey(Project, on_delete=models.CASCADE)
对于公寓任务,如果我理解正确的话,你的公寓模型可以有多个任务。所以,你可以使用 ManyToMany 字段。有了这个定义,你的每个公寓可以有多个任务。但是您的每个任务都可以属于多个公寓对象。如果您不希望每个任务可以属于不同的公寓对象,则必须设置 OneToMany 关系。您可以通过将外键字段添加到任务模型来做到这一点:
class Task(models.Model):
#...your other fields
apartment = models.ForeignKey(Apartment, on_delete=models.CASCADE)
推荐阅读
- postgresql - 如何在谷歌云平台中使用私有 IP 从我的电脑连接到 sql 实例
- javascript - 我手动触发的 Vuetify 扩展面板在您第一次触发时没有动画。首次激活后正常工作
- java - 从Java中的多个列表中获取所有重复值
- vue.js - Vue.js 3按钮在第一次点击后不起作用
- jquery - 如何响应式地在浏览器中显示相同大小的 X 图像
- css - 不能用我自己的 css 引导导航栏颜色
- css - 具有旋转线性渐变背景的填充屏幕
- python - Pandas 中的 Groupby 列并执行计算(Python)
- visual-studio-code - 如何在 Visual Studio Code 中显示 ascii 不可打印字符?
- java - Java Repository Query findAll() 给定了另一个类的 ID(外键)