如何从Django中的models.py查询数据库项目?

时间:2019-01-11 15:25:21

标签: python mysql django

我有不同的型号。一个模型的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")

2 个答案:

答案 0 :(得分:1)

您无法添加动态选择,因为它们都存储在迁移文件和表信息中。如果Django允许您这样做,则意味着每次有人向这2个模型添加一条记录时,都应创建一个新的迁移并更改数据库。您必须以不同的方式解决这个问题。

据我了解, 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)

答案 1 :(得分:0)

这无法在模型中完成并且没有意义。就像您正在尝试在表中创建具有固定选择集的列(无论如何MultiSelecField?),但是后来有人在Shift或{{ 1}}表中,初始列的选择必须再次更改。

您可以

  • 要么将您的ExamRoom列简化为assignment,然后在创建表单时动态创建选择项
  • 或者您可以尝试以不同的方式建立关系模型。例如,由于看起来CharFieldassignmentShift的组合,所以我将创建一个直通关系:
ExamRoom

创建关系时,必须选择一个Shift和一个Room,以创建shifts = models.ManyToManyField(Shift, through=Assignment) class Assignment(Model): room = ForeignKey(ExamRoom) shift = ForeignKey(Shift) invigilator = ForeignKey(Invigilator) 对象。然后,您可以查询诸如Assignmentinvigilator.shifts.all()之类的东西。