标签: django-queryset

JSON使用simplejson序列化Django模型

我想使用simplejson来序列化Django模型.Django的序列化程序不支持字典...而simplejson不支持Django Querysets.这是一个相当难的问题.

在该模型中,赞助商拥有赞助级别的外键,我试图将所有属于某个赞助商级别的赞助商组合在一起.这是生成列表的代码:

from django.shortcuts import get_list_or_404
from special_event.models import Sponsor, SponsorLevel

sponsor_dict = {}

roadie_sponsors = get_list_or_404(Sponsor, level__category = SponsorLevel.ROADIE_CHOICE)

for item in roadie_sponsors:
    try:
        sponsor_dict[item.level.name].append(item)
    except KeyError:
        sponsor_dict[item.level.name] = [item]
Run Code Online (Sandbox Code Playgroud)

sponsor_dict一旦它"制造",这就是它的样子

{
    'Fan': [<Sponsor: Fan Sponsor>], 
    'VIP': [<Sponsor: VIP Sponsor>],
    'Groupie': [<Sponsor: Groupie Sponsor>],
    'Silver': [<Sponsor: Silver Sponsor>],
    'Bronze': [<Sponsor: Another Bronze Sponsor>, <Sponsor: Bronze Sponsor>]
}
Run Code Online (Sandbox Code Playgroud)

我只在每个级别添加了一个赞助商,除了青铜器,只是为了展示它是如何工作的.我想做的就是将它"全部"转换为JSON,以便jQuery可以轻松地解释它.Django的其他序列化程序(如XML或YAML)可以实现这一目标吗?我可以"扩展"Django JSON Serializer来处理字典或"扩展"simplejson来处理Django QuerySet对象吗?

django serialization json django-queryset

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

Django:基于自定义函数过滤查询

我有一个内置在我的Django模型类中的函数,我想使用该函数来过滤我的查询结果.

  class service:
       ......
       def is_active(self):
            if datetime.now() > self.end_time:
                  return False
            return True
Run Code Online (Sandbox Code Playgroud)

现在我想将此函数用于我的查询过滤器,例如

nserv = service.objects.filter(is_active=True)
Run Code Online (Sandbox Code Playgroud)

我知道,对于这个简单的'is_active'情况,我可以直接在过滤查询中进行这种比较,但对于更复杂的情况,这可能是不可能的.我应该如何基于自定义函数进行查询?

python django django-queryset

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

模拟Django Queryset以测试采用查询集的函数

我的Django项目中有一个实用程序函数,它接受一个查询集,从中获取一些数据并返回结果.我想为这个函数写一些测试.有没有'mock'一个QuerySet?我想创建一个不接触数据库的对象,我可以为它提供一个值列表(即一些假行),然后它就像一个查询集,并允许某人对它进行字段查找/过滤/获取/全部等.

有这样的事情吗?

python django unit-testing django-queryset django-testing

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

select_related with reverse foreign key

我在Django中有两个模型.第一个是工作职能(职位)报告到哪些其他职位的层次结构,第二个是人员和他们持有的工作职能.

class PositionHierarchy(model.Model):
    pcn = models.CharField(max_length=50)
    title = models.CharField(max_length=100)
    level = models.CharField(max_length=25)
    report_to = models.ForeignKey('PositionHierachy', null=True)


class Person(model.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    ...
    position = models.ForeignKey(PositionHierarchy)
Run Code Online (Sandbox Code Playgroud)

当我有人员记录并且我想找到该人的经理时,我必须这样做

manager = person.position.report_to.person_set.all()[0]
# Can't use .first() because we haven't upgraded to 1.6 yet
Run Code Online (Sandbox Code Playgroud)

如果我找到一个人QuerySet,我可以加入(并避免第二次访问数据库)使用position和report_to using Person.objects.select_related('position', 'position__reports_to').filter(...),但有没有办法避免再次访问数据库以获取person_set?我尝试添加'position__reports_to__person_set'或刚刚position__reports_to__personselect_related,但是这似乎并没有更改查询.这prefetch_related是为了什么?

我想创建一个自定义管理器,这样当我进行查询以获取Person记录时,我也会获得他们的PositionHeirarchy和他们的经理的Person记录,而不会再往返数据库.这是我到目前为止:

class PersonWithManagerManager(models.Manager):
    def get_query_set(self):
        qs = super(PersonWithManagerManager, self).get_query_set()
        return qs.select_related(
            'position',
            'position__reports_to',
        ).prefetch_related(
        )
Run Code Online (Sandbox Code Playgroud)

django django-models django-queryset django-managers django-1.5

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

Django使用布尔字段查询注释

假设我Product在店面中有一个带有产品的模型,以及一个ProductImages包含产品图像的表格,其中可以包含零个或多个图像.这是一个简化的例子:

class Product(models.Model):
  product_name = models.CharField(max_length=255)
  # ...

class ProductImage(models.Model):
  product = models.ForeignKey(Product, related_name='images')
  image_file = models.CharField(max_length=255)
  # ...
Run Code Online (Sandbox Code Playgroud)

在显示产品的搜索结果时,我想优先考虑具有与之关联的图像的产品.我可以轻松获得图像数量:

from django.db.models import Count
Product.objects.annotate(image_count=Count('images'))
Run Code Online (Sandbox Code Playgroud)

但这实际上并不是我想要的.我想用布尔字段对它进行注释have_images,指示产品是否有一个或多个图像,以便我可以按以下方式排序:

Product.objects.annotate(have_images=(?????)).order_by('-have_images', 'product_name')
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?谢谢!

python django orm django-queryset

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

Django与GROUP BY相当于COUNT

我知道Django 1.1有一些新的聚合方法.但是我无法弄清楚以下查询的等价物:

SELECT player_type, COUNT(*) FROM players GROUP BY player_type;
Run Code Online (Sandbox Code Playgroud)

是否可以使用Django 1.1的Model Query API,还是应该使用纯SQL?

python sql django django-queryset django-aggregation

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

prefetch_related用于多个级别

如果我的模型看起来像:

class Publisher(models.Model):
    pass

class Book(models.Model):
    publisher = models.ForeignKey(Publisher)

class Page(models.Model):
    book = models.ForeignKey(Book)
Run Code Online (Sandbox Code Playgroud)

我想得到Publisher我的查询集Publisher.object.all().如果那时想确保预取我可以做:

Publisher.objects.all().prefetch_related('book_set')`
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 有没有办法使用select_related或必须使用预取prefetch_related
  2. 有没有办法预取 page_set?这不起作用:

Publisher.objects.all().prefetch_related('book_set', 'book_set_page_set')

django django-orm django-queryset

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

Django中的左外部反向select_related?

想象一下以下模型:

class Parent(Model):
    ...

class Child(Model)
    father = ForeignKey(Parent)
    ...
Run Code Online (Sandbox Code Playgroud)

有些父母有孩子,有些则没有孩子(他们不是真正意义上的父母,只是虚构的名字).

我想提出以下问题:我想列出所有的父母,如果他们有孩子,也请带孩子.这相当于Child表的左外连接,即:

select * from app_parent left join app_child on child_father_id=parent_id
Run Code Online (Sandbox Code Playgroud)

这样,当我在模板中调用Parent.child_set时,我不会在数据库中访问数十亿次.有没有办法做到这一点?谢谢

django left-join django-queryset django-select-related

28
推荐指数
3
解决办法
9304
查看次数

在Django中,你可以为查询集添加一个方法吗?

在Django中,如果我有一个模型类,例如

from django.db import models

class Transaction(models.Model):
    ...
Run Code Online (Sandbox Code Playgroud)

然后,如果我想向模型添加方法,存储例如相当复杂的过滤器,我可以添加自定义模型管理器,例如

class TransactionManager(models.Manager):

    def reasonably_complex_filter(self):
        return self.get_query_set().filter(...)


class Transaction(models.Model):
    objects = TransactionManager()
Run Code Online (Sandbox Code Playgroud)

然后我可以这样做:

>>> Transaction.objects.reasonably_complex_filter()
Run Code Online (Sandbox Code Playgroud)

有什么办法可以添加一个可以链接到模型查询集末尾的自定义方法吗?

即添加自定义方法,以便我可以这样做:

>>> Transaction.objects.filter(...).reasonably_complex_filter()
Run Code Online (Sandbox Code Playgroud)

python django django-queryset

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

使用条件注释在Django 1.8中使用最新相关值进行注释

我有以下型号:

class City(models.Model):
    ...

class Census(models.Model):
    city = models.ForeignKey(City)
    date = models.DateTimeField()
    value = models.BigIntegerField()
Run Code Online (Sandbox Code Playgroud)

现在我想用最新的人口普查值来注释City-queryset.我如何实现这一目标?

我试过了:

City.objects.annotate(population=Max('census__date'))
# --> annotates date and not value

City.objects.annotate(population=Max('census__value'))
# --> annotates highest value, not latest

City.objects.annotate(population=
    Case(
        When(
            census__date=Max('census__date'),
            then='census__value')
        )
    )

# --> annotates 'None'

City.objects.annotate(population=
    Case(
        When(
            census__date=Max('census__date'),
            then='census__value')
        ), output_field=BigIntegerField()
    )

# --> takes forever (not sure what happens at the end, after some minutes I stopped waiting)
Run Code Online (Sandbox Code Playgroud)

任何帮助非常感谢!

django django-orm django-queryset django-1.8

28
推荐指数
2
解决办法
3300
查看次数