我正在呈现一个项目列表及其相关评论。我使用了 prefetch_lated 因此它不会对每个项目的评论发出新的查询。
items = Item.objects.all().prefetch_related('reviews')
Run Code Online (Sandbox Code Playgroud)
后来,我添加了评论并尝试重新计算平均值:
item = items[0]
Review.objects.create(item=item, score=5)
# recalculate average
reviews = item.reviews.all()
...
Run Code Online (Sandbox Code Playgroud)
不好了!此评论列表不包括我刚刚创建的评论列表。如何清除此缓存以便可以重新执行查询?或者我应该以不同的方式创建评论?
我无法理解在什么情况下 .values() 或 .values_list() 比仅使用 Model 实例更好?
我认为以下都是等效的:
results = SomeModel.objects.all()
for result in results:
print(result.some_field)
results = SomeModel.objects.all().values()
for result in results:
print(result['some_field'])
results = SomeModel.objects.all().values_list()
for some_field, another_field in results:
print(some_field)
Run Code Online (Sandbox Code Playgroud)
显然这些都是愚蠢的例子,有人能指出使用 .values() / .values_list() 而不是直接使用 Model 实例的充分理由吗?
编辑 :
我做了一些简单的分析,使用包含 2 CharField(max_length=100) 的 noddy 模型,迭代了 500 个实例以将“first”复制到另一个变量,取 200 次运行的平均值,得到以下结果:
Test.objects.all() time: 0.010061947107315063
Test.objects.all().values('first') time: 0.00578328013420105
Test.objects.all().values_list('first') time: 0.005257354974746704
Test.objects.all().values_list('first', flat=True) time: 0.0052023959159851075
Test.objects.all().only('first') time: 0.011166254281997681
Run Code Online (Sandbox Code Playgroud)
所以答案很明确:性能!(大多数情况下,请参阅下面的 knbk 答案)
两种模型:帖子和作者
此视图显示每个作者的最后一篇帖子(作者是外键)
我想按降序排列这些帖子,但这不起作用。模板继续以升序方式显示这些内容。
我尝试以下操作:
视图.py
class LastestListView(ListView):
context_object_name = 'posts'
model = models.Post
ordering = ['-date']
paginate_by = 10
def get_queryset(self):
return self.model.objects.filter(pk__in=
Post.objects.values('author__id').annotate(
max_id=Max('id')).values('max_id'))
Run Code Online (Sandbox Code Playgroud)
或者:
class LastestListView(ListView):
context_object_name = 'posts'
model = models.Post
paginate_by = 10
def get_queryset(self):
return self.model.objects.filter(pk__in=
Post.objects.order_by('-date').values('author__id').annotate(
max_id=Max('id')).values('max_id'))
Run Code Online (Sandbox Code Playgroud)
必须在查询集的开头设置顺序:
class LastestListView(ListView):
context_object_name = 'posts'
model = models.Post
paginate_by = 10
def get_queryset(self):
return self.model.objects.order_by('-date').filter(pk__in=
Post.objects.values('author__id').annotate(
max_id=Max('id')).values('max_id'))
Run Code Online (Sandbox Code Playgroud) 我正在尝试将多个条件应用于我的过滤器。模型看起来像这样
class modelChat(models.Model):
source = models.ForeignKey(modelEmployer,related_name = 'rsource',on_delete=models.CASCADE,null=True,default=None,blank=True)
job = models.ForeignKey(modelJob,on_delete=models.CASCADE,null=True,default=None,blank=True)
destination = models.ForeignKey(modelEmployer,related_name = 'rdestination',on_delete=models.CASCADE,null=True,default=None,blank=True)
Run Code Online (Sandbox Code Playgroud)
最初,我试图获取一个涉及基于工作的 2 方的聊天实例。在某一时刻,源可以是目的地,有时目的地也可以是源。但工作还是一样。
这就是我的查询的样子
querySet = modelChat.objects.filter(
(Q(source=modelEmployerSourceInstance) | Q(destination=modelEmployerSourceInstance))
&
(Q(destination=modelEmployerDestinationInstance) | Q(destination=modelEmployerDestinationInstance))
&
Q(job_id=job_id)
)
Run Code Online (Sandbox Code Playgroud)
作业 ID 是正确的,我知道数据库中只有一项。但是,此查询始终返回一个空项。有什么建议为什么这是错误的以及我该如何解决它?
我在数据库中有一个列,我们将其称为 dummy_column。它有正值和负值。我想计算所有正数的总和以及所有负数的总和以及总和(正+负),即我想要输出 3 个单独的值。
可以使用 Sum('dummy_column') 计算两者的总和
尝试使用 Case 和 When,但无法理解在“then”子句中放入什么内容。
看到这个相关的答案,但我想避免“额外”。- ' Django 查询集 SUM 正值和负值'
代码写得不多,所以就没有写了。任何帮助,将不胜感激。
我有一个带有过滤器和排除的简单查询。排除 Q & Q 不起作用的情况。
以下是我正在使用的查询。
start_date = (datetime(time.localtime().tm_year, time.localtime().tm_mon, 1) - timedelta(1)).replace(day=1)
data = models.Test.objects.filter(
is_deleted=False).exclude(Q(status__in=[1,2,3]) & Q(modified_at__lt=start_date))\
.select_related('created_by')\
.prefetch_related('name')
Run Code Online (Sandbox Code Playgroud)
我希望排除工作。如果我使用两次排除,我就会得到结果。
这个问题可能很奇怪,但我想检索除用户登录创建的对象之外的对象
好吧,我在我看来尝试了这段代码
def getobjects(request):
products=Products.objects.filter(user!= request.user)
Run Code Online (Sandbox Code Playgroud)
但不起作用。
模型中
class Products(models.Model):
name=models.Charfield()
user=models.ForeignKey(User)
Run Code Online (Sandbox Code Playgroud)
我需要有关正确查询功能的帮助来处理此问题。提前致谢
问题:我已经为一个模型实现了一个自定义管理器,只有一个命名的自定义查询集get_by_tag,如果我这样使用它,它就可以正常工作:
ViewStatistic.objects.get_by_tag('some-tag-name').filter(user=user_id)
Run Code Online (Sandbox Code Playgroud)
但是当我改变查询的顺序时,以这种方式:
ViewStatistic.objects.filter(user=user_id).get_by_tag('some-tag-name')
Run Code Online (Sandbox Code Playgroud)
它不起作用!并引发此错误:
AttributeError: 'QuerySet' object has no attribute 'get_by_tag'
Run Code Online (Sandbox Code Playgroud)
我是不是错过了什么?!我怎样才能按照这样的顺序做到这一点?
PS:自定义管理器是这样的:
AttributeError: 'QuerySet' object has no attribute 'get_by_tag'
Run Code Online (Sandbox Code Playgroud) 我正在使用 Django 过滤器来为我的项目进行一些过滤。我有以下型号:
class Foo(models.Model):
pass
class Bar(models.Model):
foo = models.ForeignKey(Foo, models.CASCADE)
Run Code Online (Sandbox Code Playgroud)
我的查询如下所示:
Foo.objects.filter(blah=blah)
Run Code Online (Sandbox Code Playgroud)
我想通过仅提供至少有 5 个通过 FK 连接的 Bar 对象的 Foo 对象来缩小此过滤器的范围。
因此,如果我有 3 个 Foo 对象,它们分别有 7、5 和 3 个具有 id 的 Bar 对象,那么只有前两个应该在最终查询集中。我该如何做到这一点,以便评估的查询集在内存中只包含前两个对象?
谢谢!
我正在 React 中创建一个表,从 Django DB 中获取一些数据。
它有过滤器,我希望它们在需要时调用 API 来获取结果。
问题是我必须复制很多行,而我很确定有更好的方法来做到这一点。
这是代码的一部分:
if ss_value and not es_value and not iv_value and not timestamp:
queryset = DailyReport.objects.all().filter(station_departure=ss_value)
elif not ss_value and es_value and not iv_value and not timestamp:
queryset = DailyReport.objects.all().filter(station_arrival=es_value)
elif not ss_value and not es_value and iv_value and not timestamp:
queryset = DailyReport.objects.all().filter(is_virtual=iv_value)
elif not ss_value and not es_value and not iv_value and timestamp:
queryset = DailyReport.objects.all().filter(
Q(timestamp__range=(min_dt, max_dt)) | Q(upload_timestamp__range=(min_dt, max_dt)))
logger.debug(queryset)
elif ss_value and es_value and not iv_value …Run Code Online (Sandbox Code Playgroud)