我正试图找到一种方法来实现自定义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.
有没有办法在不重新定义子类QuerySet和Manager子类中的所有方法的情况下执行此操作?
假设我有一个Book模型,其中包含Publisher模型的外键.
我如何在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)
并在视图中解析结果,但这对我来说似乎不对.
我正在创建一个类似于您现在所在页面的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代码中对它进行排序,但是如果可能的话我想避免这样做.
我已经在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模型中存储了一些浮点数据,只有一定范围的值才有意义.因此,我想在模型和SQL约束级别强加这些限制.
例如,我想做这样的事情:
class Foo(Model):
myfloat = FloatField(min=0.0, max=1.0)
Run Code Online (Sandbox Code Playgroud)
我想在模型级别而不是表单级别执行此操作.事实上,我可能希望表单级别具有不同的范围; 例如,在表单级别使用百分比[0,100],但在模型中转换为[0,1].
这是可能的,如果可以的话,我该怎么做呢?
我有一个这样的模型
class Task(models.Model):
progress = models.PositiveIntegerField()
estimated_days = models.PositiveIntegerField()
Run Code Online (Sandbox Code Playgroud)
现在我想Sum(progress * estimated_days)在数据库级别进行计算.使用Django聚合我可以得到每个字段的总和,但不能得到字段乘法的总和.
当我尝试将属性与另一个具有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) 嗨假设我有一个像这样的简单模型类:
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列表.
是否可以在不初始检索外键对象的情况下使用外键创建对象?
我有UserProfile场模型avatar = models.ImageField(upload_to=upload_avatar)
upload_avatar函数名称图像文件根据user.id(例如12.png).
但是当用户更新头像时,新的头像名称与旧的头像名称一致,Django将后缀添加到文件名(例如12-1.png).
有办法覆盖文件而不是创建新文件?
django ×10
django-models ×10
django-orm ×2
python ×2
django-1.1 ×1
django-admin ×1
django-views ×1