0

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

2 回答 2

1

您不能添加动态选择,因为它们都存储在迁移文件和表信息中。如果 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)
于 2019-01-11T15:48:36.510 回答
0

这不能在模型中完成,也没有意义。这就像您试图在具有特定固定选择集的表中创建列(无论如何?),但是当有人稍后在or表MultiSelecField中添加新行时,初始列选择必须再次更改。ShiftExamRoom

你可以

  • 要么使您的assignment列简单CharField,并在创建表单时动态创建选择
  • 或者你可以尝试以不同的方式建立你的关系模型。例如,由于它看起来像是andassignment的组合,我将创建一个直通关系:ShiftExamRoom
shifts = models.ManyToManyField(Shift, through=Assignment)

class Assignment(Model):
    room = ForeignKey(ExamRoom)
    shift = ForeignKey(Shift)
    invigilator = ForeignKey(Invigilator)

创建关系时,您必须选择一个 Shift 和一个 Room 来创建Assignment对象。然后你可以查询类似invigilator.shifts.all()or的东西invigilator.assignment_set.first().room

于 2019-01-11T16:01:09.607 回答