Python 如何在Django中从models.py查询数据库项?

Python 如何在Django中从models.py查询数据库项?,python,mysql,django,Python,Mysql,Django,我有不同的型号。一个模型的Multiselctfield的选择依赖于另一个模型。因此,在执行此操作时,必须在model.py内查询数据库,这会导致迁移问题。(表不存在错误) 无法添加动态选项,因为它们都存储在迁移文件和表信息中。如果Django允许您这样做,这意味着每次有人向这两个模型添加记录时,都应该创建一个新的迁移,并且应该更改数据库。你必须以不同的方式处理这个问题 据我所知,有一个ChainedManyToMany字段,可以实现这一功能 以下是回购协议的一个例子 from smart_se

我有不同的型号。一个模型的Multiselctfield的选择依赖于另一个模型。因此,在执行此操作时,必须在model.py内查询数据库,这会导致迁移问题。(表不存在错误)


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

据我所知,有一个
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)

这不能在模型中完成,也没有意义。这就像您试图在表中创建一列,其中包含一组固定的选项(什么是
MultiSelecField
),但当稍后有人在
Shift
ExamRoom
表中添加新行时,初始列选项必须再次更改

你可以

  • 赋值
    列设置为简单的
    字符域
    ,并在创建表单时动态创建选项
  • 或者,你也可以尝试以不同的方式建立关系模型。例如,由于
    赋值
    似乎是
    移位
    ExamRoom
    的组合,因此我将创建一个贯穿关系:

在创建关系时,您必须选择一个班次和一个房间来创建
分配
对象。然后,您可以查询诸如
监考人.shift.all()
监考人.assignment\u set.first().room

您使用了错误的方法,您需要使用模型之间的关系,而不是选择字段。就你而言,这是一个多领域的问题。这可能需要重新思考您如何构建模型,但这是唯一的方法。请详细说明您的建议。我不完全了解您试图实现的目标,以及
Shift
ExamRoom
模型是什么,以及
分配
应该代表什么。因此,我只能说,一个多人的关系看起来就是你所需要的。或者,在表单中动态创建选项。但这不能在模型中完成。您的选择是动态的,每次有人向数据库添加
Shift
ExamRoom
时,您的选择都会发生变化,因此无法在创建时进行设置。请在问题中详细说明。我建议添加更多关于
班次
监考人
考试室
的信息,以及它们之间的关系。班次模型包含早班、晚班等班次。考场模型用于考场,如1号室、2号室等。对于多选场,我需要两者的组合:早班1号室。因此,多对多领域也不适用。轮班和检查室是独立的,因为它们在其他情况下单独使用。我应该改变数据模型的架构还是有办法合并它们?我有Shift和ExamRoom,我让admin选择了它们。对于作业字段,我希望根据班次和ExamROom自动生成作业,我不希望用户手动(通过外键)添加作业。如果我有4个班次和4个教室(由超级用户添加),现在我希望作业字段自动生成16个选项。根据您的方法,我将不得不在分配模型中添加房间,班次,我不想添加,因为我知道我将在所有班次的所有房间中分配。谢谢您回答我的问题。我的老师告诉我“我将添加考场、监考人和轮班。根据我提供的数据,作业应该有选择。监考人一天可以有多个作业。”然后采取我建议的第一种方法:将作业设为CharField,并以Django形式创建选项,并在模板中呈现。但在我看来,这将导致不太好的用户体验:用户现在必须从n个房间和m个班次中进行选择,而不是从n x m个选项中进行选择,这可能会变得很麻烦。请注意,我的作业模式允许每位监考人进行多个作业(
invigulator.Assignment\u set.all()
)否、班次总数(n)和考试室总数(m)将由学院提供。监考人必须选择他们可用的班次,这些班次将存储在监考人模式中的班次(M2M)中。现在我的任务是在监考者分配字段中显示所有可能的分配(n*m),如复选框,查看监考者可用的班次,并根据该班次分配它们(这将由Django代码完成,而不是手动完成)。顺便说一句,我是Django的新手,不知道所有功能(
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)
shifts = models.ManyToManyField(Shift, through=Assignment)

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