相关疑难解决方法(0)

如何使用Django查询集中的条件注释Count

使用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"是额外的日期时间对象).继续下去并不多.

python django django-queryset

53
推荐指数
2
解决办法
3万
查看次数

Django:ManyToMany过滤器匹配列表中的所有项目

我有这样的书模型:

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问题,但无法得到明确的答案.任何好的指针也会有所帮助.谢谢.

django django-orm manytomanyfield django-queryset

18
推荐指数
2
解决办法
7594
查看次数

使用__in查找django icontains

所以我想在某些字段中找到任何类型的匹配,例如,这就是我想要做的:

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:我发布的查询不起作用,这只是一种表达我需要的方式(以防万一)

python django

15
推荐指数
2
解决办法
5476
查看次数

Django Rest Framework ManyToMany过滤多个值

我有两个模型,一个定义用户,另一个定义这些用户的标签.我正在使用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

码:

models.py

class Label(models.Model):
    name = models.CharField(max_length = 60)

class User(models.Model):
    labels = models.ManyToManyField(Label)
Run Code Online (Sandbox Code Playgroud)

filters.py

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)

serializers.py

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)

django many-to-many django-rest-framework

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

Django 多对一关系过滤器集

我有几个模型设置,如下所示:

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 的内容的每个组都返回给我。任何建议或朝正确方向的推动都会非常有帮助!

谢谢。

python django django-orm

3
推荐指数
1
解决办法
9916
查看次数

Django过滤器,其中ManyToMany字段包含所有列表

我有一个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_listAttributeChoice对象列表在哪里.然后我也会得到只有"小"或"红"的对象,但不是两者.

所以这个查询都匹配:

  • CartItem A,小,红色
  • CartItem B,小
  • CartItem C,红色

虽然我想要的是一个只能匹配CartItem A的查询.

现在......我可以创建很多AND语句,但我需要一个灵活的解决方案,可以包含1或100个要过滤的属性.所以传递它的对象列表会很棒.

想法?

python django

3
推荐指数
1
解决办法
4614
查看次数