无法访问annotate()中的to_attr属性

时间:2018-07-14 16:18:06

标签: python django prefetch annotate

我有以下代码:

queue = Queue_item.objects.prefetch_related(Prefetch('queue_item_id', 
queryset=Platform.objects.all().order_by('-time'), to_attr='platforms'))
queue = queue.annotate(first_time=Min('platforms__time')).order_by('first_time')

运行它时,我收到一条错误消息,指出在queue.annotate中,即使我之前在prefetch_related中设置了它,也找不到平台。

我想念什么?

[编辑]

#models.py

import django
from django.db import models

class Queue_item(models.Model):
caption = models.TextField(max_length=1000)
path_to_picture = models.CharField(max_length=255)

def create(self):
    self.save()

def __str__(self):
    return self.caption.split(' ')[0]

class Platform(models.Model):

queue_item_id = models.ForeignKey(
    Queue_item,
    on_delete=models.CASCADE
)

time = models.DateTimeField(default=django.utils.timezone.now)

INSTAGRAM = 'IG'
FACEBOOK = 'FB'
TWITTER = 'TW'

PLATFORM_CHOICES = (
    (INSTAGRAM, 'Instagram'),
    (FACEBOOK, 'Facebook'),
    (TWITTER, 'Twitter'),
)

platform = models.CharField(
    max_length=2,
    choices=PLATFORM_CHOICES,
    default=INSTAGRAM
)

谢谢!

1 个答案:

答案 0 :(得分:0)

好吧,反向关系名称是django使用的默认名称:platform(模型名称),如下所示:

class Platform(models.Model):
    queue_item_id = models.ForeignKey(
        Queue_item,
        on_delete=models.CASCADE
    )

我们可以使用反向名称执行查询,然后您尝试使用不正确的s访问它。

...to_attr='platforms')...
queue.annotate(first_time=Min('platforms__time'))

正确的是:

....to_attr='platform')...
queue.annotate(first_time=Min('platform__time'))

OR

如果要将to_attr='platforms'platforms__times一起使用,则可以更改反向名称

queue_item_id = models.ForeignKey(
    Queue_item,reverse_name='platforms',
    on_delete=models.CASCADE
)
  

由于queue_item_id是外键,因此无需以_id结尾字段名称。只需queue_item就可以了,Django已经为您创建了一个类似queue_item_id