在 Django 中,我如何根据两个模型中的字段自动创建多对多条目

Posted

技术标签:

【中文标题】在 Django 中,我如何根据两个模型中的字段自动创建多对多条目【英文标题】:In Django how I can create automatically a many to many entry based on a field found in two models 【发布时间】:2022-01-09 11:25:13 【问题描述】:

我有以下模型示例:

class TestSet(models.Model):
    name = models.CharField(max_length=50)

    def __str__(self):
        return self.name

class Class(models.Model):
    name = models.CharField(max_length=50)
    test_set_id = models.ForeignKey(TestSet)

    def __str__(self):
        return self.name

class Test(models.Model):
    title = models.CharField(max_length=50)
    test_set_id = models.ForeignKey(TestSet)

    def __str__(self):
        return self.title

class ClassTest(models.Model):
    class_id = models.ForeignKey(Class)
    test_id = models.ForeignKey(TestSet)
    memo = models.CharField(max_length=250)

    def __str__(self):
        return self.memo

我想要做的是,当创建一个新的类或测试时,如果它们的 test_set_id 与数据库上的当前条目匹配,它也应该自动创建一个 ClassTest 条目。

例子:

    假设我已经有三个 Test 对象,其中 test_set_id = 1 我创建了一个新的 Class 对象,其中 test_set_id = 1 创建新的 Class 对象后,程序还应在 ClassTest 模型中创建 3 个新条目,根据 test_set_id 字段的匹配将类连接到测试。 如果添加了一个新的 Test 对象,它应该也能正常工作。

【问题讨论】:

【参考方案1】:

所以想到了两个答案:

    您可以使用Django Signals 创建接收器,在创建类对象时执行特定命令。下面的代码周围的东西。考虑到instance 基本上是刚刚创建的类,您可以简单地操作标准的 django 查询,获取并创建其他对象。
@receiver(post_save, sender=Class)
def create_test_sets(sender, instance, created, **kwargs):
    if created:
        ///do things///
        
    再想一想,我想问一下您要解决的总体用例是什么。我觉得这里有些冗余,但我无法完全弄清楚在哪里,除非你帮我收集更大的图景。

【讨论】:

我用信号解决了这个问题,谢谢。关于冗余,我也有这种感觉。用例是: 1. 管理员创建了一些课程,他将指定一个测试集字段并为每个课程分配一名教师。 2. 之后,test_creator 将添加一些测试,并为每个测试指定该测试集字段。 3. 如果课程中的测试集与添加的测验相同,则应在这两者之间建立链接。 4. 下次老师登录他的帐户时,他应该能够看到所有可用于他的课程的测验。

以上是关于在 Django 中,我如何根据两个模型中的字段自动创建多对多条目的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 中自定义 slug 字段?

在 Django 模型中使用 save() 会产生 TypeError

根据值在 Admin 中自定义 Django 表单字段

Django中的自定义纬度/经度表单字段

在 Django 中,根据模型中其他字段中选择的值删除选择字段下拉列表中的选项

从显示自定义字段的 Django 模型呈现可排序表的最佳方法?