python - 如何在 Django 中从 models.py 中查询数据库项?
问题描述
我有不同的型号。一个模型的Multiselctfield的选择依赖于另一个模型。因此,必须在model.py中查询数据库,这样做会导致迁移问题。(表不存在错误)
class Invigilator(models.Model):
---
# this method queries Shift objects and Examroom
def get_invigilator_assignment_list ():
assignment = []
shifts = Shift.objects.all()
for shift in shifts:
rooms= ExamRoom.objects.all()
for room in rooms:
assign = str (shift.shiftName)+ " " +str (room.name)
assignment.append (assign)
return assignment
assignment_choice = []
assign = get_invigilator_assignment_list()
i = 0
for assignm in assign:
datatuple = (i,assignm)
assignment_choice.append(datatuple)
i= i+1
ASSIGNMENT_CHOICE = tuple(assignment_choice)
assignment =MultiSelectField (choices = ASSIGNMENT_CHOICE, blank = True, verbose_name="Assignments")
解决方案
您不能添加动态选择,因为它们都存储在迁移文件和表信息中。如果 Django 允许您这样做,这意味着每次有人向这两个模型添加记录时,都应该创建一个新的迁移并且应该更改数据库。你必须以不同的方式处理这个问题。
据我所知django-smart-selects有一个ChainedManyToMany
可以解决问题的字段。
这是回购的一个例子。
from smart_selects.db_fields import ChainedManyToManyField
class Publication(models.Model):
name = models.CharField(max_length=255)
class Writer(models.Model):
name = models.CharField(max_length=255)
publications = models.ManyToManyField('Publication', blank=True, null=True)
class Book(models.Model):
publication = models.ForeignKey(Publication)
writer = ChainedManyToManyField(
Writer,
chained_field="publication",
chained_model_field="publications")
name = models.CharField(max_length=255)
推荐阅读
- php - Symfony 4 LegacyRouteLoader 和 LegacyController
- c# - 如何将最后输入的数字加到总数中?
- telnetlib - Telnetlib 似乎没有传递 .write 命令
- javascript - AEM:使用 JavaScript Use-API 访问 DAM 中的 JS 文件
- c# - ASP核心版本3中的Facebook登录异常
- python - 带有 Groupby 的 Pandas Boxplot - 在每个类别的列中绘制矢量数组
- ssh - 通过 SSH 的长选项的焦油问题
- python - 在python中,如何使类实例隐式?
- bash - 是否可以让mac os上的终端输入线更加突出(加颜色等)
- kubernetes - Kubernetes Ingress 描述未显示主机名