В 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 совпадает с текущими записями в базе данных.

Пример:

  1. Lets say I already have three Test objects with test_set_id = 1
  2. I create a new Class object with test_set_id = 1
  3. 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.
  4. It should work the same if a new Test object is added.

Итак, есть два ответа, которые приходят в голову:

  1. Вы можете использовать Django Signals для создания приемника, который выполняет определенную команду при создании объекта Class. Примерно так, как показано ниже. Учтите, что instance - это, по сути, только что созданный класс, и вы можете просто оперировать стандартными django запросами, получая и создавая дополнительные объекты.
@receiver(post_save, sender=Class)
def create_test_sets(sender, instance, created, **kwargs):
    if created:
        ///do things///
        
  1. На секунду задумавшись, я бы спросил, какой общий сценарий использования вы пытаетесь решить. Я чувствую, что здесь есть некоторая избыточность, но я не могу полностью понять, где именно, если вы не поможете мне собрать общую картину.
Вернуться на верх