标签: django-orm

如何在保留顺序的情况下查询列表

我想根据列表进行查询。我知道我可以这样做:

lists = [Everton, Liverpool, Villa]
queryset = Betting.objects.filter(matches__in=list)
Run Code Online (Sandbox Code Playgroud)

但是,这不会按顺序查询表。我正在做的操作是基于fuzzywuzzy的,并且至关重要的是查询是按照列表的顺序完成的

我已经看到这个解决方案django-create-a-queryset-from-a-list-preserving-order.html但它似乎不适用于 sqllite

谢谢..任何帮助将不胜感激

python django django-models django-orm

5
推荐指数
1
解决办法
806
查看次数

使用 QuerySet.values() 时获取模型实例

假设我有两个模型,一个引用另一个:

class Shelf(models.Model):
     pass

class Book(models.Model):
     shelf = models.ForeignKey(Shelf)
Run Code Online (Sandbox Code Playgroud)

我想values()在实例的查询集中使用Book

In [1]: Book.objects.create(shelf=Shelf.objects.create())
Out[1]: <Book: Book object>

In [2]: Book.objects.values()
Out[2]: [{'id': 1, 'shelf_id': 1}]
Run Code Online (Sandbox Code Playgroud)

问题在于返回的字典仅包含相关Shelf实例的主键而不是实例本身。有没有办法在单个查询中获取实际实例?例如:

In [2]: Book.objects.values()
Out[2]: [{'id': 1, 'shelf': <Shelf: Shelf object>}]
Run Code Online (Sandbox Code Playgroud)

我使用的原因values()是这样我可以合并不同模型的两个查询集,我想将它们排序并呈现到视图中的单个表中。

django django-orm

5
推荐指数
1
解决办法
3674
查看次数

将带有大 IN 子句的 Django ORM 查询转换为表值构造函数

我有一些 Django 代码,它以编程方式构建相对复杂的查询,通过一系列过滤器和排除调用将各种过滤器应用于初始数据集:

for filter in filters:
    if filter['name'] == 'revenue':
        accounts = accounts.filter(account_revenue__in: filter['values'])
    if filter['name'] == 'some_other_type':
        if filter['type'] == 'inclusion':
            accounts = accounts.filter(account__some_relation__in: filter['values'])
        if filter['type'] == 'exclusion':
            accounts = accounts.exclude(account__some_relation__in: filter['values'])
    ...etc

return accounts
Run Code Online (Sandbox Code Playgroud)

对于大多数这些条件,过滤器的可能值相对较小且包含在内,因此 Django 的 ORM 生成的 IN 子句具有足够的性能。然而,在某些情况下,IN 子句可能会更大(10K - 100K 项)。

在普通的 postgres 中,我可以通过使用表值构造函数使这个查询更加优化,例如:

SELECT domain 
FROM accounts 
INNER JOIN  ( 
    VALUES  ('somedomain.com'), ('anotherdomain.com'), ...etc 10K more times 
) VALS(v) ON accounts.domain=v
Run Code Online (Sandbox Code Playgroud)

如果原始查询中有超过 30K 的 IN 子句,则运行时间可能超过 60 秒,而表值版本的查询则需要 1 秒,这是一个巨大的差异。

但我无法弄清楚如何让 …

django postgresql django-orm django-postgresql

5
推荐指数
0
解决办法
410
查看次数

在 Django 中按文件大小过滤(FileField)

我有一个模型:

class MyModel(models.Model):
    file = models.FileField(verbose_name='File', upload_to="files/")
Run Code Online (Sandbox Code Playgroud)

我可以获取文件大小(以字节为单位):

size = my_model_instance.file.size
Run Code Online (Sandbox Code Playgroud)

如何在 Django 中按文件大小过滤?像这样的东西:

MyModel.object.filter(file.size__lt=128)
Run Code Online (Sandbox Code Playgroud)

django django-orm filefield

5
推荐指数
1
解决办法
1139
查看次数

Django ORM - 在 FROM 子句中使用子查询

目标:使用 RowNumber 函数获取每行的编号,然后按值进行过滤,但保留不应用过滤器时给出的相应 RowNumber,否则 RowNumber 将始终返回 1。

\n\n

在转换为 Django ORM 之前,我发现获取 SQL 语法很有帮助,如下所示:

\n\n
SELECT rn.row_number, name \nFROM ( SELECT ROW_NUMBER() OVER (ORDER BY name), name\n       FROM customer ) as rn\nWHERE name = 'Juan' \n
Run Code Online (Sandbox Code Playgroud)\n\n

问题我可以\xc2\xb4t 设法将其转换为 Django ORM。我已经尝试过以下方法:

\n\n
subq = models.Customer.objects.all().annotate(\n            rank=Window(\n                expression=RowNumber(),\n                order_by=(F('name'))\n            )\n           )\n
Run Code Online (Sandbox Code Playgroud)\n\n

Here\xc2\xb4s 我不\xc2\xb4t 不知道如何继续。如何告诉我的models.Customer在其查询中使用subq作为FROM

\n

django django-orm

5
推荐指数
0
解决办法
175
查看次数

Django:从字典列表中批量更新,无需构建整个查询集

我有一个包含字典的列表。就像是:

[{'id': 0, 'price': 20}, {'id': 1, 'price': 10}] # a few thousands of elements
Run Code Online (Sandbox Code Playgroud)

如何在不构建整个查询集的情况下更新相应的模型?

django django-models django-orm

5
推荐指数
1
解决办法
2305
查看次数

在任意字段等价上预取不相关模型

我有这样的代码:

for m in MyModel.objects.filter(...):
    mo = MyOtherModel.objects.get(myOtherField=m.myField)
    print("{:s}{:s}".format(m, mo))
Run Code Online (Sandbox Code Playgroud)

这是低效的,因为查找mo需要对数据库进行新的查询。

为了避免这种情况,我正在考虑使用prefetch_related(Prefetch())or .annotate()

第一个的问题是Prefetch()两个模型之间需要外键关系(它们没有)。

同样的事情.注释:

MyModel.objects.filter(...).annotate(moWithSameField=F('myField') == F(???))
Run Code Online (Sandbox Code Playgroud)

^ 即使我知道要写什么,这也是错误的???

这可以吗?您可以根据任意查询预取完全不相关的内容吗?

django django-orm

5
推荐指数
1
解决办法
721
查看次数

Django ORM:如何按日期排序,然后选择按外键分组的最佳对象?

我意识到我的标题有点复杂,但请允许我演示一下。我使用的是 Django 2.2.5 和 Python 3。以下是我当前正在使用的模型:

from django.db import models
from django.db.models import F
from django.contrib.postgres.indexes import GinIndex
from django.contrib.postgres.search import SearchVectorField, SearchVector, SearchQuery, SearchRank

class Thread(models.Model):
    title = models.CharField(max_length=100)
    last_update = models.DateTimeField(auto_now=True)

class PostQuerySet(models.QuerySet):
    _search_vector = SearchVector('thread__type') + \
                     SearchVector('thread__title') + \
                     SearchVector('from_name') + \
                     SearchVector('from_email') + \
                     SearchVector('message')

    ###
    # There's code here that updates the `Post.search_vector` field for each `Post` object
    # using `PostQuerySet._search_vector`.
    ###

    def search(self, text):
        """
            Search posts using the indexed `search_vector` field. I …
Run Code Online (Sandbox Code Playgroud)

python django postgresql full-text-search django-orm

5
推荐指数
1
解决办法
4319
查看次数

在同一模型上应用 union() 无法识别使用 GenericRelation 的排序

我有一个像这样的文章模型

from django.contrib.contenttypes.fields import GenericRelation
from django.db import models
from hitcount.models import HitCountMixin, HitCount

class Article(models.Model):
    title = models.CharField(max_length=250)
    hit_count_generic = GenericRelation(
    HitCount, object_id_field='object_pk',
    related_query_name='hit_count_generic_relation')
Run Code Online (Sandbox Code Playgroud)

当我这样做时Article.objects.order_by('hit_count_generic__hits'),我会得到结果。但是当我这样做时

articles_by_id = Article.objects.filter(id__in=ids).annotate(qs_order=models.Value(0, models.IntegerField()))
articles_by_name = Article.objects.filter(title__icontains='sports').annotate(qs_order=models.Value(1, models.IntegerField()))
articles = articles_by_id.union(articles_by_name).order_by('qs_order', 'hit_count_generic__hits')
Run Code Online (Sandbox Code Playgroud)

出现错误

ORDER BY 术语与结果集中的任何列都不匹配

我怎样才能实现这样的结合?我必须使用 union 而不是 AND 和 OR,因为我需要保留顺序。IE; articles_by_id 应该排在第一位,articles_by_name 应该排在第二位。

使用 Django hitcount 进行 hitcount https://github.com/thornomad/django-hitcount。点击数模型如下。

class HitCount(models.Model):
"""
Model that stores the hit totals for any content object.
"""
hits = models.PositiveIntegerField(default=0)
modified = models.DateTimeField(auto_now=True) …
Run Code Online (Sandbox Code Playgroud)

django django-orm

5
推荐指数
1
解决办法
1611
查看次数

Django ManyToMany 字段的 set() 操作是否清除现有关系?

下面2种情况在Django ORM操作上有什么区别吗?会有任何性能提升等吗?

obj.manytomanyfield.clear()
obj.manytomanyfield.add(1,2,3,4,5)
Run Code Online (Sandbox Code Playgroud)

obj.manytomanyfield.set([1,2,3,4,5])
Run Code Online (Sandbox Code Playgroud)

django django-models django-orm django-views python-2.7

5
推荐指数
1
解决办法
2457
查看次数