使用Django ORM,可以做一些像queryset.objects.annotate(Count('queryset_objects', gte=VALUE))
.抓住我的漂移?
这是一个用于说明可能答案的简单示例:
在Django网站中,内容创建者提交文章,并且普通用户查看(即阅读)所述文章.文章可以发表(即可供所有人阅读),也可以草稿模式.描述这些要求的模型是:
class Article(models.Model):
author = models.ForeignKey(User)
published = models.BooleanField(default=False)
class Readership(models.Model):
reader = models.ForeignKey(User)
which_article = models.ForeignKey(Article)
what_time = models.DateTimeField(auto_now_add=True)
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何获得所有发表的文章,按照过去30分钟的独特读者排序?即我想要计算每个发表的文章在过去半小时内获得的不同(独特)视图的数量,然后生成按这些不同视图排序的文章列表.
我试过了:
date = datetime.now()-timedelta(minutes=30)
articles = Article.objects.filter(published=True).extra(select = {
"views" : """
SELECT COUNT(*)
FROM myapp_readership
JOIN myapp_article on myapp_readership.which_article_id = myapp_article.id
WHERE myapp_readership.reader_id = myapp_user.id
AND myapp_readership.what_time > %s """ % date,
}).order_by("-views")
Run Code Online (Sandbox Code Playgroud)
这引发了错误:语法错误在"01"或附近(其中"01"是额外的日期时间对象).继续下去并不多.
我有这样的书模型:
class Book(models.Model):
authors = models.ManyToManyField(Author, ...)
...
Run Code Online (Sandbox Code Playgroud)
简而言之:
我想检索作者严格等于给定作者集的书籍.我不确定是否有单个查询可以执行此操作,但任何建议都会有所帮助.
长期:
这是我尝试过的(无法运行获取AttributeError)
# A sample set of authors
target_authors = set((author_1, author_2))
# To reduce the search space,
# first retrieve those books with just 2 authors.
candidate_books = Book.objects.annotate(c=Count('authors')).filter(c=len(target_authors))
final_books = QuerySet()
for author in target_authors:
temp_books = candidate_books.filter(authors__in=[author])
final_books = final_books and temp_books
Run Code Online (Sandbox Code Playgroud)
......这就是我得到的:
AttributeError: 'NoneType' object has no attribute '_meta'
Run Code Online (Sandbox Code Playgroud)
一般来说,我应该如何查询模型,其约束条件是其ManyToMany字段包含一组给定的对象,就像我的情况一样?
ps:我发现了一些相关的SO问题,但无法得到明确的答案.任何好的指针也会有所帮助.谢谢.
所以我想在某些字段中找到任何类型的匹配,例如,这就是我想要做的:
possible_merchants = ["amazon", "web", "services"]
# Possible name --> "Amazon Service"
Companies.objects.filter(name__icontains__in=possible_merchants)
Run Code Online (Sandbox Code Playgroud)
遗憾的是,无法混合icontains和__in查找.
它似乎是一个非常复杂的查询,所以如果至少我可以忽略大小足够的名称,例如:
Companies.objects.filter(name__ignorecase__in=possible_merchants)
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
PD:我发布的查询不起作用,这只是一种表达我需要的方式(以防万一)
我有两个模型,一个定义用户,另一个定义这些用户的标签.我正在使用Django Rest Framework来创建API.我希望能够至少查询标签ID为1和2的用户.
例如,用户的标签是:
[(1,2), (1,2,3), (2,3), (1,3)]
我希望查询返回
[(1,2), (1,2,3)]
.
到目前为止,我已经成功地查询带有指定标签的用户(假设ID = 1),这样做:/api/users/?labels=1
,但我无法查询用户标签1和2.我已经试过/api/users/?labels=1,2
或/api/users/?labels=1&labels=2
但却返回一些无效的用户,即没有标签1或2的用户......
欢迎任何帮助.
谢谢,
迪米特里
Github测试回购:
https://github.com/TheDimLebowski/drf-m2m-filter
码:
class Label(models.Model):
name = models.CharField(max_length = 60)
class User(models.Model):
labels = models.ManyToManyField(Label)
Run Code Online (Sandbox Code Playgroud)
class UserFilter(django_filters.FilterSet):
labels = django_filters.filters.BaseInFilter(
name='labels',
lookup_type='in',
)
class Meta:
model = User
fields = ('labels',)
Run Code Online (Sandbox Code Playgroud)
class LabelSerializer(serializers.ModelSerializer):
class Meta:
model = Label
fields = ('id','name')
class UserSerializer(serializers.ModelSerializer):
labels = LabelSerializer(many = True)
class Meta:
model = User …
Run Code Online (Sandbox Code Playgroud) 我有几个模型设置,如下所示:
Group(models.Model):
name = models.TextField(max_length=255)
Thing(models.Model):
location = models.TextField(max_length=255)
group = models.ForeignKey(Group)
Run Code Online (Sandbox Code Playgroud)
这只是说明关系的一个例子,所以请原谅任何语法错误。
我的问题是,如何找到具有一组特定位置的组?我应该能够使用以下方法访问与组关联的事物:
Group.thing_set
Run Code Online (Sandbox Code Playgroud)
对?那么有什么方法可以根据thing_set中的项目进行过滤吗?我在想一些类似的事情。
Group.objects.filter(thing_set.location in ["Location A", "Location B"]).all()
Run Code Online (Sandbox Code Playgroud)
希望这能将包含来自位置 A 和位置 B 的内容的每个组都返回给我。任何建议或朝正确方向的推动都会非常有帮助!
谢谢。
我有一个CartItem
带有ManyToMany字段的AttributeChoice
模型到模型.例如,a CartItem
可以具有AttributeChoice
"小"和"红色".
我想找到我的CartItem
两个都有"小"和"红"的属性.如果我执行以下操作:
CartItem.objects.get(cart=cart, product=product, attribute__in=attribute_list)
Run Code Online (Sandbox Code Playgroud)
"小"和"红" attribute_list
的AttributeChoice
对象列表在哪里.然后我也会得到只有"小"或"红"的对象,但不是两者.
所以这个查询都匹配:
虽然我想要的是一个只能匹配CartItem A的查询.
现在......我可以创建很多AND语句,但我需要一个灵活的解决方案,可以包含1或100个要过滤的属性.所以传递它的对象列表会很棒.
想法?