我想根据列表进行查询。我知道我可以这样做:
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
谢谢..任何帮助将不胜感激
假设我有两个模型,一个引用另一个:
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 代码,它以编程方式构建相对复杂的查询,通过一系列过滤器和排除调用将各种过滤器应用于初始数据集:
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 秒,这是一个巨大的差异。
但我无法弄清楚如何让 …
我有一个模型:
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) 目标:使用 RowNumber 函数获取每行的编号,然后按值进行过滤,但保留不应用过滤器时给出的相应 RowNumber,否则 RowNumber 将始终返回 1。
\n\n在转换为 Django ORM 之前,我发现获取 SQL 语法很有帮助,如下所示:
\n\nSELECT rn.row_number, name \nFROM ( SELECT ROW_NUMBER() OVER (ORDER BY name), name\n FROM customer ) as rn\nWHERE name = 'Juan' \nRun Code Online (Sandbox Code Playgroud)\n\n问题我可以\xc2\xb4t 设法将其转换为 Django ORM。我已经尝试过以下方法:
\n\nsubq = models.Customer.objects.all().annotate(\n rank=Window(\n expression=RowNumber(),\n order_by=(F('name'))\n )\n )\nRun Code Online (Sandbox Code Playgroud)\n\nHere\xc2\xb4s 我不\xc2\xb4t 不知道如何继续。如何告诉我的models.Customer在其查询中使用subq作为FROM?
\n我有一个包含字典的列表。就像是:
[{'id': 0, 'price': 20}, {'id': 1, 'price': 10}] # a few thousands of elements
Run Code Online (Sandbox Code Playgroud)
如何在不构建整个查询集的情况下更新相应的模型?
我有这样的代码:
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 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) 我有一个像这样的文章模型
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) 下面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)