标签: django-orm

对Sum进行注释会导致None而不是零

我正在创建一个类似于您现在所在页面的QA网站.我试图通过他们的分数来命令答案,但是没有选票的答案将他们的分数设置为无而不是0.这导致答案没有选票在页面底部排在负排名的答案之下.当没有答案投票时,如何使注释得分为零?

这是我的模特:

from django.contrib.auth.models import User

Answer(models.Model):
    //some fields here
    pass

VOTE_CHOICES = ((-1, Down), (1, Up))

Vote(models.Model):
    user = models.ForeignKey(User)
    answer = models.ForeignKey(Answer)
    type = models.IntegerField(choices = VOTE_CHOICES)

    class Meta:
        unique_together = (user, answer)
Run Code Online (Sandbox Code Playgroud)

这是我的查询:

answers = Answer.objects.filter(<something here>)
                        .annotate(score=Sum('vote__type'))
                        .order_by('-score')
Run Code Online (Sandbox Code Playgroud)

编辑:要清楚,我想在查询中执行此操作.我知道我可以把它变成一个列表,然后在我的python代码中对它进行排序,但是如果可能的话我想避免这样做.

django django-models django-orm

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

Django聚合:两个字段的乘法求和

我有一个这样的模型

class Task(models.Model):
    progress = models.PositiveIntegerField()
    estimated_days = models.PositiveIntegerField()
Run Code Online (Sandbox Code Playgroud)

现在我想Sum(progress * estimated_days)在数据库级别进行计算.使用Django聚合我可以得到每个字段的总和,但不能得到字段乘法的总和.

python django django-models django-orm django-queryset

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

从Django过滤器调用返回的列表的默认顺序是什么?

简短问题
当连接到PostgreSQL数据库时,从Django过滤器调用返回的列表的默认顺序是什么?

背景
通过我自己也承认,我提出在应用一个糟糕的假设层,在其返回一个列表中的顺序将是常数,即不使用"ORDER_BY".我查询的项目列表不是按字母顺序或任何其他故意的顺序.它被认为保持与添加到数据库中的顺序相同.

这个假设适用于数百个查询,但是当订单在不知不觉中发生变化时,我的应用程序报告了失败.据我所知,在这段时间内没有触及这些记录,因为我是维护数据库的唯一人.令人困惑的是,当在Mac OS X上运行Django应用程序时,它仍然按预期工作,但在Win XP上,它改变了顺序.(请注意,上面提到的数百个查询都在Win XP上).

任何对此的见解都会有所帮助,因为我在Django或PostgreSQL文档中找不到解释操作系统差异的任何内容.

示例呼叫

required_tests = Card_Test.objects.using(get_database()).filter(name__icontains=key)
Run Code Online (Sandbox Code Playgroud)

编辑
今天与我的一些同事交谈后,我得到了与BjörnLindqvist相同的答案.

回想起来,我明白为什么这样做经常出错.使用ORM Django,sqlalchemy或其他任何一个好处是您可以编写命令而无需了解或理解(详细)它所连接的数据库.不可否认,我碰巧是其中一个用户.然而,另一方面,在不知道数据库的情况下,这样的调试错误非常麻烦并且可能是灾难性的.

python django postgresql sql-order-by django-orm

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

Django orm获得每个组的最新消息

我正在使用django 1.6与Mysql

我有这个型号

class Student(models.Model):
     username = models.CharField(max_length=200, unique = True)

class Score(models.Model)
     student = models.ForeignKey(Student)
     date = models.DateTimeField()
     score = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)

现在我想获得每个学生的最新成绩记录.
我试过了

Score.objects.values('student').annotate(latest_date=Max('date'))
Run Code Online (Sandbox Code Playgroud)

我也试过了

Score.objects.values('student__username').annotate(latest_date=Max('date'))
Run Code Online (Sandbox Code Playgroud)

如描述Django ORM - 获取组的最新记录, 但它没有帮助.

python django django-orm django-queryset

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

如何使用自定义管理器与相关对象?

我有一个自定义经理.我想将它用于相关对象.我在docs中找到了 use_for_related_fields.但它不像我使用它的方式工作:

class RandomQueryset(models.query.QuerySet):

    def randomize(self):       
        count = self.count()
        random_index = random.randint(0, count - 1)
        return self.all()[random_index]


class RandomManager(models.Manager):

    use_for_related_fields = True

    def get_query_set(self):
        return RandomQueryset(self.model, using=self._db)

    def randomize(self):
        return self.get_query_set().randomize()
Run Code Online (Sandbox Code Playgroud)

我用它作为一个型号:

>>> post = PostPages.default_manager.filter(image_gallery__isnull=False).distinct().randomize()
Run Code Online (Sandbox Code Playgroud)

并试图对m2m相关对象做同样的事情:

>>> post.image_gallery.randomize()
Run Code Online (Sandbox Code Playgroud)

出了错误:

AttributeError: 'ManyRelatedManager' object has no attribute 'randomize'
Run Code Online (Sandbox Code Playgroud)

是否可以像我一样使用自定义管理器?如果是这样,你如何使它工作?

编辑

我的模特:

class ShivaImage(models.Model, ImageResizing):
    image = models.ImageField(upload_to='img')
    slide_show = models.BooleanField() 
    title = models.CharField(max_length=100)
    text = models.TextField(max_length=400)
    ordering = models.IntegerField(blank=True, null=True)

    objects = RandomManager()


class PostPages(models.Model):
    image_gallery = models.ManyToManyField(ShivaImage, blank=True,
                                       related_name='gallery',) …
Run Code Online (Sandbox Code Playgroud)

django django-orm django-managers

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

Django相当于SQL不在

我有一个非常简单的查询:select * from tbl1 where title not in('asdasd', 'asdasd').

我如何将其翻译成Django?这就像我想要的相反:Table.objects.filter(title__in=myListOfTitles)

django django-orm

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

在Django中序列化外键对象

我一直致力于在Django中开发一些RESTful服务,以便与Flash和Android应用程序一起使用.

开发服务接口非常简单,但我遇到了序列化具有外键和多对多关系的对象的问题.

我有这样的模型:

class Artifact( models.Model ):
    name                = models.CharField( max_length = 255 )
    year_of_origin      = models.IntegerField( max_length = 4, blank = True, null = True )
    object_type         = models.ForeignKey( ObjectType, blank = True, null = True )
    individual          = models.ForeignKey( Individual, blank = True, null = True )
    notes               = models.TextField( blank = True, null = True )
Run Code Online (Sandbox Code Playgroud)

然后我将使用这样的模型执行查询select_related(),以确保遵循外键关系:

artifact = Artifact.objects.select_related().get(pk=pk)
Run Code Online (Sandbox Code Playgroud)

一旦我拥有了该对象,我将其序列化,并将其传递回我的视图:

serializers.serialize( "json", [ artifact ] )
Run Code Online (Sandbox Code Playgroud)

这就是我得到的,请注意外键(object_type和individual)只是其相关对象的id.

[
      {
            pk: 1
            model: "artifacts.artifact"
            fields: …
Run Code Online (Sandbox Code Playgroud)

python django django-orm

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

Django:强制选择相关?

我已经创建了一个模型,我正在为它渲染默认/未修改的模型形式.这仅产生64个SQL查询,因为它有很多外键,而这些外键又有更多的外键.

是否可以强制它始终(默认情况下)select_related每次返回其中一个模型时执行?

django django-orm

37
推荐指数
2
解决办法
7819
查看次数

Django ORM - objects.filter()与objects.all().filter() - 首选哪一个?

我经常看到像这样的结构

MyModel.objects.all().filter(...)
Run Code Online (Sandbox Code Playgroud)

这将返回默认Mananger的QuerySet.起初all()似乎是多余的,因为

MyMode.objects.filter(...)
Run Code Online (Sandbox Code Playgroud)

提供相同的结果.

但是,这对于默认的Manager似乎是安全的,因为Django文档中有以下两个语句:

摘自"添加额外管理器方法"一章

自定义Manager方法可以返回您想要的任何内容.它不必返回QuerySet.

all()经理方法的定义:

all()返回当前QuerySet(或QuerySet子类)的副本.这在您可能希望传入模型管理器或QuerySet并对结果进行进一步过滤的情况下非常有用.在任一对象上调用all()之后,你肯定会有一个QuerySet来使用.

这似乎有点像我的矛盾.一方面,Django提供了让管理器方法返回任何首选对象类型的自由,另一方面它需要一个QuerySet用于该all()方法.我知道每个经理都有一个get_queryset被调用的方法all().但谁阻止我压倒all()我的自定义经理?虽然我同意这样做是不好的设计.

  • 所以据我所知,该all()方法不保证返回QuerySet.到底是什么MyModel.objects回报?这句话是否要求all()?还是`get_queryset()?

  • 你喜欢MyModel.objects.filter(...)还是MyModel.objects.all().filter(...).如果是这样,为什么?

  • 您是否曾遇到过那些会以不合需要的方式搞乱这些方法的经理?

python django django-orm django-queryset django-managers

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

django-orm不区分大小写的顺序

我知道,我可以从DJango ORM进行不区分大小写的搜索.喜欢,

User.objects.filter(first_name__contains="jake")
User.objects.filter(first_name__contains="sulley")
User.objects.filter(first_name__icontains="Jake")
User.objects.filter(first_name__icontains="Sulley")
Run Code Online (Sandbox Code Playgroud)

而且,我可以把它们当作

user_list = User.objects.all().order_by("first_name")
# sequence: (Jake, Sulley, jake, sulley)
user_list = User.objects.all().order_by("-first_name") # for reverse
# sequence: (sulley, jake, Sulley, Jake)
Run Code Online (Sandbox Code Playgroud)

对于不区分大小写的提取有直接的方法吗?就像我想要一个序列一样

# desired sequence: jake, Jake, sulley, Sulley
Run Code Online (Sandbox Code Playgroud)

如果没有,那么建议一个最好的方法来做到这一点.提前致谢.

django case-insensitive django-orm fetch

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