在 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 模型中使用 save() 会产生 TypeError