重写保存方法迫使我在管理中保存两次



在Django 1.8.4 上工作

所以,我得到了这些模型:

class Occurences(models.Model):
    datetime = models.DateTimeField()
class Serie(models.Model):
    first_occurence = models.DateTimeField(null=True, blank=True)
    last_occurence = models.DateTimeField(null=True, blank=True)
    occurences = models.ManyToManyField(Occurence, null=True, blank=True)
    def save(self, *args, **kwargs):
        super(Series, self).save(*args, **kwargs)
        self.first_occurence = self.occurences.order_by['-datetime'].first()
        self.last_occurence = self.occurences.order_by['datetime'].last()
        super(Series, self).save(*args, **kwargs)

在manage.py shell上工作得很好。

但一旦我使用管理界面进行修改,它就无法直接工作。我必须修改occurrences字段,保存它,然后重新加载它,以便在最后再次保存。。。

我已经试过在save函数的开头、开头和结尾(两次)以及结尾执行super(…).save(。

我的目标是能够按首次出现(或最后一次,但一次就足够了)排序。

Serie.objects.order_by('first_occurence__datetime')

因为这不起作用

Serie.objects.order_by('occurence__first')
Serie.objects.order_by('occurence__first__datetime')
Serie.objects.order_by('occurence__set__first')

我就是不明白:/

由于Django ORM,这些对first_occurencelast_occurence的显式引用实际上是不必要的。它们将提供的所有功能都可以通过ManyToMany字段occurences隐式获得。

如果将Meta.ordering属性添加到Occurences模型中,则可以查询第一个和最后一个。例如:

class Occurence(models.Model):
    datetime = models.DateTimeField()
    class Meta:
        ordering = ('datetime',)
class Series(models.Model):
    first_occurence = models.DateTimeField(null=True, blank=True)
    last_occurence = models.DateTimeField(null=True, blank=True)
    occurences = models.ManyToManyField(Occurence, null=True, blank=True)

my_series = Series.objects.get(...)
first = my_series.objects.earliest()
latest = my_series.objects.latest()

此外,鉴于上述情况,您可以根据发生次数进行排序,以查看哪些发生次数最晚(或最早)。例如:

series_with_latest_occurences = Series.objects.order_by('-occurences__datetime')
series_with_earliest_occurences = Series.objects.order_by('occurences__datetime')

最新更新