首页 > 解决方案 > 如何在 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")

标签: pythonmysqldjango

解决方案


您不能添加动态选择,因为它们都存储在迁移文件和表信息中。如果 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)

推荐阅读