我正在创建一个类似于您现在所在页面的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代码中对它进行排序,但是如果可能的话我想避免这样做.
我有一个这样的模型
class Task(models.Model):
progress = models.PositiveIntegerField()
estimated_days = models.PositiveIntegerField()
Run Code Online (Sandbox Code Playgroud)
现在我想Sum(progress * estimated_days)在数据库级别进行计算.使用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或其他任何一个好处是您可以编写命令而无需了解或理解(详细)它所连接的数据库.不可否认,我碰巧是其中一个用户.然而,另一方面,在不知道数据库的情况下,这样的调试错误非常麻烦并且可能是灾难性的.
我正在使用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 - 获取组的最新记录, 但它没有帮助.
我有一个自定义经理.我想将它用于相关对象.我在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) 我有一个非常简单的查询:select * from tbl1 where title not in('asdasd', 'asdasd').
我如何将其翻译成Django?这就像我想要的相反:Table.objects.filter(title__in=myListOfTitles)
我一直致力于在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) 我已经创建了一个模型,我正在为它渲染默认/未修改的模型形式.这仅产生64个SQL查询,因为它有很多外键,而这些外键又有更多的外键.
是否可以强制它始终(默认情况下)select_related每次返回其中一个模型时执行?
我经常看到像这样的结构
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(...).如果是这样,为什么?
您是否曾遇到过那些会以不合需要的方式搞乱这些方法的经理?
我知道,我可以从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)
如果没有,那么建议一个最好的方法来做到这一点.提前致谢.