使用Django1.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上工作出色。

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

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

我的目标是能够按first_occurence(或last,但一个就足够了)进行排序。

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')

关于python - 覆盖保存方法强制我在管理内容中保存两次,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33373513/

10-15 01:57
查看更多