标签: django-orm

如何在 prefetch_lated 之后清除 Django 的缓存查询

我正在呈现一个项目列表及其相关评论。我使用了 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)

不好了!此评论列表不包括我刚刚创建的评论列表。如何清除此缓存以便可以重新执行查询?或者我应该以不同的方式创建评论?

django-orm

4
推荐指数
1
解决办法
2771
查看次数

Django:理解 .values() 和 .values_list() 用例

我无法理解在什么情况下 .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 答案)

python django django-models django-orm python-3.x

4
推荐指数
1
解决办法
1万
查看次数

使用 get_queryset 对列表视图进行排序

两种模型:帖子和作者
此视图显示每个作者的最后一篇帖子(作者是外键)

我想按降序排列这些帖子,但这不起作用。模板继续以升序方式显示这些内容。
我尝试以下操作:

视图.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)

django django-orm

4
推荐指数
1
解决办法
3479
查看次数

Django Q对象查询过滤多个条件失败

我正在尝试将多个条件应用于我的过滤器。模型看起来像这样

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 是正确的,我知道数据库中只有一项。但是,此查询始终返回一个空项。有什么建议为什么这是错误的以及我该如何解决它?

python django django-models django-orm

4
推荐指数
1
解决办法
6267
查看次数

Django ORM 分别查询正值和负值之和

我在数据库中有一个列,我们将其称为 dummy_column。它有正值和负值。我想计算所有正数的总和以及所有负数的总和以及总和(正+负),即我想要输出 3 个单独的值。

可以使用 Sum('dummy_column') 计算两者的总和

尝试使用 Case 和 When,但无法理解在“then”子句中放入什么内容。

看到这个相关的答案,但我想避免“额外”。- ' Django 查询集 SUM 正值和负值'

代码写得不多,所以就没有写了。任何帮助,将不胜感激。

django django-orm python-3.x

4
推荐指数
1
解决办法
1800
查看次数

如何在 Django ORM 中使用 Q & Q 修复排除

我有一个带有过滤器和排除的简单查询。排除 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)

我希望排除工作。如果我使用两次排除,我就会得到结果。

django django-orm

4
推荐指数
1
解决办法
4790
查看次数

如何检索不是由用户创建的对象?

这个问题可能很奇怪,但我想检索除用户登录创建的对象之外的对象

好吧,我在我看来尝试了这段代码

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)

我需要有关正确查询功能的帮助来处理此问题。提前致谢

python django django-models django-orm

4
推荐指数
1
解决办法
194
查看次数

Django 管理器查询不能在查询链中工作。AttributeError:“QuerySet”对象没有属性<管理器方法>

问题:我已经为一个模型实现了一个自定义管理器,只有一个命名的自定义查询集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)

python django django-models django-orm django-managers

4
推荐指数
1
解决办法
1842
查看次数

Django查询集基于子元素数量的过滤器

我正在使用 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 对象,那么只有前两个应该在最终查询集中。我该如何做到这一点,以便评估的查询集在内存中只包含前两个对象?

谢谢!

python django django-orm django-filter

4
推荐指数
1
解决办法
590
查看次数

如何在查询集中动态设置 Django 过滤器

我正在 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)

django django-orm django-queryset

4
推荐指数
1
解决办法
1949
查看次数