В Django как я могу автоматически создать запись типа "многие ко многим" на основе поля, находящегося в двух моделях
У меня есть пример следующих моделей:
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
Я хочу, чтобы при создании нового класса или теста автоматически создавалась запись ClassTest, если их test_set_id совпадает с текущими записями в базе данных.
Пример:
- Lets say I already have three Test objects with test_set_id = 1
- I create a new Class object with test_set_id = 1
- After creating the new Class object, the program should also create 3 new entries in the ClassTest model connecting classes to tests based on the match of the test_set_id field.
- It should work the same if a new Test object is added.
Итак, есть два ответа, которые приходят в голову:
- Вы можете использовать Django Signals для создания приемника, который выполняет определенную команду при создании объекта Class. Примерно так, как показано ниже. Учтите, что
instance
- это, по сути, только что созданный класс, и вы можете просто оперировать стандартными django запросами, получая и создавая дополнительные объекты.
@receiver(post_save, sender=Class)
def create_test_sets(sender, instance, created, **kwargs):
if created:
///do things///
- На секунду задумавшись, я бы спросил, какой общий сценарий использования вы пытаетесь решить. Я чувствую, что здесь есть некоторая избыточность, но я не могу полностью понять, где именно, если вы не поможете мне собрать общую картину.