我有以下代码:
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
)
谢谢!
答案 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__time
和s
一起使用,则可以更改反向名称
queue_item_id = models.ForeignKey(
Queue_item,reverse_name='platforms',
on_delete=models.CASCADE
)
由于
queue_item_id
是外键,因此无需以_id
结尾字段名称。只需queue_item
就可以了,Django已经为您创建了一个类似queue_item_id
的