使用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上工作得很好。
但是一旦我使用管理界面进行修改,它就无法直接使用。我必须修改occurences字段,保存它,并重新加载它以在结束时再次重新保存...
我已经尝试在保存功能的开头,以及它的开头和结尾(两次)执行super(...)。save(...),以及最后。
我的目标是能够通过first_occurence订购(或者最后一次,但是一次就足够了。)
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')
我只是不明白:/
答案 0 :(得分:3)
由于Django ORM,这些对first_occurence
和last_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')