python - 创建另一个模型的实例时自动填充 Django 模型字段
问题描述
我有三个模型 Student、Question 和 StudentAndQuestion
class Student(models.Model):
class Meta:
verbose_name_plural = "Students"
name = models.CharField(max_length=150)
surname = models.CharField(max_length=150)
code = models.CharField(max_length=10)
# group = models.ForeignKey(Group,on_delete=models.CASCADE)
points = models.IntegerField(default=0)
class Question(models.Model):
class Meta:
verbose_name_plural = "Questions"
text = models.CharField(max_length=1500)
variants = models.CharField(max_length=1500)
theme = models.OneToOneField(Theme, on_delete=models.CASCADE)
anwser = models.CharField(max_length=1500)
class StudentAndQuestion(models.Model):
question = models.OneToOneField(Question,on_delete=models.CASCADE)
student = models.OneToOneField(Student,on_delete=models.CASCADE)
is_learned = models.BooleanField(default=0)
points = models.IntegerField(default=0)
我希望 Django 在我创建新的学生实例时填写 StudentAndQuestion(例如,为所有问题创建行并将点设置为零)并且当我创建新的问题实例时将其添加到所有旧学生
解决方案
您可以收听保存这些模型时发出的Post Save Signal,并在处理程序中进行所需的创建。这个信号使用一个参数调用处理程序,created
如果True
创建了新记录,则该参数被调用。
请参阅有关信号的文档以了解如何注册您的处理程序。一个样本如下
from django.db.models.signals import post_delete, post_save
from .models import Student, Question, StudentAndQuestion
def add_question_to_students(sender, instance, created, *args, **kwargs):
question = instance
if created:
StudentAndQuestion.objects.bulk_create([
StudentAndQuestion(question=question, student_id=student_id)
for student_id in Student.objects.values_list("id", flat=True)
])
def add_student_to_question(sender, instance, created, *args, **kwargs):
student = instance
if created:
StudentAndQuestion.objects.bulk_create([
StudentAndQuestion(question=question_id, student=student)
for question_id in Question.objects.values_list("id", flat=True)
])
post_save.connect(add_question_to_students, sender=Question)
post_save.connect(add_student_to_question, sender=Student)
或者,您可以覆盖两个模型中的保存以执行相同的操作
class Question(models.Model):
....
def save(*args, **kwargs):
is_create = self.pk is None
instance = super().save(*args, **kwargs)
add_question_to_students(Question, self, is_created)
class Student(models.Model):
....
def save(*args, **kwargs):
is_create = self.pk is None
instance = super().save(*args, **kwargs)
add_student_to_question(Student, self, is_created)
我觉得后者更清楚,因为更容易找出保存时发生的一切,但如果模型位于不同的应用程序中,它可能会导致循环依赖。
推荐阅读
- javascript - 在存储库容器上找不到参数 [] 的方法 google()
- php - 解析错误:语法错误、意外的 '?>'、期望函数 (T_FUNCTION) 或 const (T_CONST)
- c++ - SDL2_pollevent() 控制器 dpad 连续保持?
- python - Tensorflow 中 sess.run(c) 和 c.eval() 的区别
- ios - 根据价格对核心数据进行排序
- r - 在数百万个坐标中按组计算最大距离
- cassandra - tombstone_failure_threshold 为每个表或整个 cassanandra 集群维护
- android - 在 Titanium 应用程序中添加 benCoding.AlarmManager 模块时应用程序崩溃
- ios - 谷歌地图 GMSMarker 改变相机焦点 iOS
- photoeditorsdk - 将 PESDK 主题更改为白色