Django4: Создание объекта для третьей модели для каждого элемента в отношении "многие ко многим
Возможно, этот вопрос слишком сложен для Stackoverflow, дайте мне знать, если есть более подходящий форум для такого рода вопросов.
У меня есть три модели, которые зависят друг от друга. Мне нужен механизм, который создает результат для каждого элемента в Pipeline.ms_file. Когда я назначаю файл на конвейер, он должен быть обработан и должен быть создан объект Results. Когда я удаляю файл из конвейера, экземпляр Result должен быть удален. Возможно, это можно сделать с помощью сигналов. Хотя это будет немного некрасиво, когда файл удаляется из конвейера. Мне пришлось бы перебирать все результаты и определять те, которые теперь недействительны. Интересно, есть ли лучший способ сделать это? Может быть, мне вообще не стоит использовать поле ManyToMany в этой ситуации?
На самом деле ситуация немного сложнее. На самом деле, список целей назначается конвейеру, а при создании файла создается результат для каждой комбинации целей и файлов. Основной проблемой является удаление, поскольку при сохранении экземпляра конвейера информация об удаленных файлах исчезает.
class MsFile(models.Model):
name = models.CharField(max_length=300)
instrument = models.ForeignKey(Instrument, on_delete=models.SET_NULL, null=True)
method = models.ForeignKey(Method, on_delete=models.CASCADE, null=True)
# file = models.FileField()
def __str__(self): return self.name
class Pipeline(models.Model):
name = models.CharField(max_length=300)
targetlist = models.ForeignKey(TargetList, on_delete=models.SET_NULL, null=True)
method = models.ForeignKey(Method, on_delete=models.CASCADE, null=True)
ms_file = models.ManyToManyField(MsFile, blank=True)
def __str__(self): return self.name
class Result(models.Model):
target = models.ForeignKey(Target, on_delete=models.CASCADE)
ms_file = models.ForeignKey(MsFile, on_delete=models.CASCADE)
intensity = models.FloatField()
Есть ли лучший шаблон для этой ситуации, который следует использовать в Django 4?
Другие модели
class Target(models.Model):
label = models.CharField(max_length=300)
compound = models.ForeignKey(Compound, on_delete=models.CASCADE, null=True, blank=True)
rt_min = models.FloatField()
rt_max = models.FloatField()
mz_mean = models.FloatField()
mz_width = models.FloatField()
method = models.ForeignKey(Method, on_delete=models.CASCADE, null=True)
def __str__(self): return self.label
class TargetList(models.Model):
name = models.CharField(max_length=300)
target = models.ManyToManyField(Target)
def __str__(self): return self.name