标签: django-models

自定义QuerySet和Manager而不会破坏DRY?

我正试图找到一种方法来实现自定义QuerySet和自定义Manager而不会破坏DRY.这是我到目前为止:

class MyInquiryManager(models.Manager):
    def for_user(self, user):
        return self.get_query_set().filter(
                    Q(assigned_to_user=user) |
                    Q(assigned_to_group__in=user.groups.all())
                )

class Inquiry(models.Model):   
    ts = models.DateTimeField(auto_now_add=True)
    status = models.ForeignKey(InquiryStatus)
    assigned_to_user = models.ForeignKey(User, blank=True, null=True)
    assigned_to_group = models.ForeignKey(Group, blank=True, null=True)
    objects = MyInquiryManager()
Run Code Online (Sandbox Code Playgroud)

这很好,直到我做这样的事情:

inquiries = Inquiry.objects.filter(status=some_status)
my_inquiry_count = inquiries.for_user(request.user).count()
Run Code Online (Sandbox Code Playgroud)

这会立即打破一切,因为QuerySet它没有相同的方法Manager.我已经尝试创建一个自定义QuerySet类,并在其中实现它MyInquiryManager,但我最终复制了所有的方法定义.

我也发现这个片段有效,但我需要传递额外的参数,for_user因此它会因为重新定义而严重依赖get_query_set.

有没有办法在不重新定义子类QuerySetManager子类中的所有方法的情况下执行此操作?

django django-models django-queryset django-managers

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

如何将可排序的计数列添加到具有多对一关系的模型的Django管理员?

假设我有一个Book模型,其中包含Publisher模型的外键.

我如何在Django管理员中显示每个发布者发布的图书数量的列,我可以使用内置排序?

django django-models django-admin

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

在Django中按日期计算记录数

我有一个类似于以下的模型:

class Review(models.Model):
    venue = models.ForeignKey(Venue, db_index=True)
    review = models.TextField()  
    datetime_created = models.DateTimeField(default=datetime.now)
Run Code Online (Sandbox Code Playgroud)

我想查询数据库以获得按天分组的场地的评论总数.MySQL查询将是:

SELECT DATE(datetime_created), count(id) 
FROM REVIEW 
WHERE venue_id = 2
GROUP BY DATE(datetime_created);
Run Code Online (Sandbox Code Playgroud)

在Django中实现这一目标的最佳方法是什么?我可以用

Review.objects.filter(venue__pk=2)
Run Code Online (Sandbox Code Playgroud)

并在视图中解析结果,但这对我来说似乎不对.

python django django-models django-queryset django-1.1

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

对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:prefetch_related()是否遵循反向关系查找?

我已经在trunk中尝试了django 1.4中的prefetch_related(),并且无法使其预取反向查找.

我的简化模型(每本书都有很多价格):

class Book(models.Model):
    # some fields

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

我的观点是:

books = Book.objects.prefetch_related('price')
Run Code Online (Sandbox Code Playgroud)

然后,我收到了AttributeError消息:

AttributeError: Cannot find 'price' on Book object, 'price' is an invalid parameter to prefetch_related()
Run Code Online (Sandbox Code Playgroud)

如何使它工作?谢谢.

django django-models django-queryset

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

如何创建具有最大和最小限制的Django FloatField?

我在我的Django模型中存储了一些浮点数据,只有一定范围的值才有意义.因此,我想在模型和SQL约束级别强加这些限制.

例如,我想做这样的事情:

class Foo(Model):
   myfloat = FloatField(min=0.0, max=1.0)
Run Code Online (Sandbox Code Playgroud)

我想在模型级别而不是表单级别执行此操作.事实上,我可能希望表单级别具有不同的范围; 例如,在表单级别使用百分比[0,100],但在模型中转换为[0,1].

这是可能的,如果可以的话,我该怎么做呢?

django django-models

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

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 - get()返回了多个主题

当我尝试将属性与另一个具有M到M关系的属性关联时,我收到此错误:

get()返回了多个主题 - 它返回2!

你能告诉我这意味着什么,也许可以提前告诉我如何避免这个错误?

楷模

class LearningObjective(models.Model):
    learning_objective=models.TextField()

class Topic(models.Model):
    learning_objective_topic=models.ManyToManyField(LearningObjective)
    topic=models.TextField()
Run Code Online (Sandbox Code Playgroud)

输出 LearningObjective.objects.all()

[<LearningObjective: lO1>, <LearningObjective: lO2>, <LearningObjective: lO3>]
Run Code Online (Sandbox Code Playgroud)

输出 Topic.objects.all()

[<Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>, <Topic: Topic object>]
Run Code Online (Sandbox Code Playgroud)

意见

 def create_themen(request):
     new_topic=Topic(topic=request.POST['topic'])
     new_topic.save()
     return render(request, 'topic.html', {'topic': topic.objects.all()})

 def create_learning_objective(request):
     new_learning_objective=LearningObjective(learning_objective=request.POST['learning_objective']) …
Run Code Online (Sandbox Code Playgroud)

django django-models django-views

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

具有外键创建的Django模型对象

嗨假设我有一个像这样的简单模型类:

class TestModel(models.Model):
    testkey = models.ForeignKey(TestModel2)
    ...
Run Code Online (Sandbox Code Playgroud)

当我创建一个TestModel对象时,我必须传递一个TestModel2对象的实例来创建它:

testkey =TestModel2.objects.get(id=...)
TestModel.objects.create(testkey=testkey)
Run Code Online (Sandbox Code Playgroud)

这导致我想要对数据库进行2次查询,并且我有一个创建对象所需的外键ID列表.

是否可以在不初始检索外键对象的情况下使用外键创建对象?

django django-models

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

ImageField覆盖具有相同名称的图像文件

我有UserProfile场模型avatar = models.ImageField(upload_to=upload_avatar)

upload_avatar函数名称图像文件根据user.id(例如12.png).

但是当用户更新头像时,新的头像名称与旧的头像名称一致,Django将后缀添加到文件名(例如12-1.png).

有办法覆盖文件而不是创建新文件

django django-models

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