Django ManyToManyField跨模型删除

Django ManyToManyField跨模型删除,django,django-models,Django,Django Models,我有以下低效的“破坏”方法来删除刺激中的评级,而刺激本身是在实验中进行的(为了清晰起见,我简化了我的模型) 你能建议一种更有效的方法来实现这一点吗 class Rating(models.Model): rater = TextField(null=True) rating = FloatField(null=True) created = models.DateTimeField(null=True) class Stimulus(TimeStampedModel)

我有以下低效的“破坏”方法来删除刺激中的评级,而刺激本身是在实验中进行的(为了清晰起见,我简化了我的模型)

你能建议一种更有效的方法来实现这一点吗

class Rating(models.Model):
    rater = TextField(null=True)
    rating = FloatField(null=True)
    created = models.DateTimeField(null=True)


class Stimulus(TimeStampedModel):
    genes = TextField()
    weights = ListField()
    ratings = ManyToManyField(Rating, null=True)
    evaluation = FloatField(null=True)
    complete = BooleanField(default=False)


Class Experiment(models.Model):
        all_individuals = ManyToManyField(Stimulus, null=True)

        def destroy(self):
            all_ratings = Rating.objects.all()
            for ind in self.all_individuals.all():
                ratings = ind.ratings.all()
                for rating in ratings:
                    if rating in all_ratings:
                        Rating.objects.filter(id = rating.id).delete()

背景:我正在使用Django运行一个实验,向用户显示许多刺激。每种刺激都会被多次评级。因此,我需要保存每个刺激的多个评分(以及每个实验的多个刺激)。

一些简单的改进

  • 删除
    如果所有_评级中的评级
    ,则所有评级都将在所有评级列表中

  • 在数据库端执行以下操作:

  • 用于获取外键对象
  • 合并后将是:

    def destroy(self):
        for ind in self.all_individuals.prefetch_related('ratings'):  
            ratings = ind.ratings.all().delete()
    

    我认为在这种情况下,使用ManyToManyField并不是最好的选择

    如果使用common ForeignKey稍微改变一下此模型的结构,问题就会少一些

    例如

    这是一个更清晰的结构,当您删除实验时,
    Experiment\u instance.delete()
    删除级联将删除所有其他相关模型


    希望能有所帮助。

    不过,这不是被删除的实验,而是一个愚蠢的问题的预先评级。我认为ForeignKey只允许你在给定的“单元格”中有一个实例,而不是很多。我将用一点背景知识更新我的问题,这将有助于澄清我的情况。
    self.all_individuals.prefetch_related('ratings'):  
    
    def destroy(self):
        for ind in self.all_individuals.prefetch_related('ratings'):  
            ratings = ind.ratings.all().delete()
    
    class Rating(models.Model):
        rater = TextField(null=True)
        rating = FloatField(null=True)
        created = models.DateTimeField(null=True)
    
        stimulus = models.ForeignKey('Stimulus', related_name='ratings')
    
    class Stimulus(TimeStampedModel):
        genes = TextField()
        weights = ListField()
        #ratings = ManyToManyField(Rating, null=True)
        evaluation = FloatField(null=True)
        complete = BooleanField(default=False)
    
        experiment = models.ForeignKey('Experiment', related_name='stimulus')
    
    class Experiment(models.Model):
        #all_individuals = ManyToManyField(Stimulus, null=True)
        name = models.CharField(max_length=100)