考虑简单的Django模型Event
和Participant
:
class Event(models.Model):
title = models.CharField(max_length=100)
class Participant(models.Model):
event = models.ForeignKey(Event, db_index=True)
is_paid = models.BooleanField(default=False, db_index=True)
Run Code Online (Sandbox Code Playgroud)
使用参与者总数来注释事件查询很容易:
events = Event.objects.all().annotate(participants=models.Count('participant'))
Run Code Online (Sandbox Code Playgroud)
如何用过滤的参与者数量进行注释is_paid=True
?
我需要查询所有事件而不管参与者的数量,例如,我不需要按注释结果进行过滤.如果有0
参与者,那没关系,我只需要0
注释值.
文档中的示例在此处不起作用,因为它从查询中排除对象而不是使用它进行注释0
.
更新.Django 1.8具有新的条件表达式功能,所以现在我们可以这样做:
events = Event.objects.all().annotate(paid_participants=models.Sum(
models.Case(
models.When(participant__is_paid=True, then=1),
default=0,
output_field=models.IntegerField()
)))
Run Code Online (Sandbox Code Playgroud)
我发现 Xamarin 文档示例建议像这样向 AssemblyInfo.cs 添加权限令人困惑:
// Need to access the internet for GCM
[assembly: UsesPermission(Name = "android.permission.INTERNET")]
Run Code Online (Sandbox Code Playgroud)
为什么?权限通常在 AndroidManifest.xml 中定义,在 Xamarin Studio 中甚至还有 GUI。
似乎 AssemblyInfo.cs 也包含有关标题和版本的信息:
[assembly: AssemblyTitle("MyApp")]
[assembly: AssemblyVersion("1.0.0")]
Run Code Online (Sandbox Code Playgroud)
这意味着什么?AndroidManifest.xml 还包含标题和版本信息。
它们有什么关系?似乎是基础知识,但没有找到明确的解释。
这是一个基本示例 - 帖子由用户拥有和喜欢。如何为特定用户选择喜欢的帖子?
import datetime
import peewee
class User(peewee.Model):
name = peewee.CharField(max_length=200)
class Post(peewee.Model):
user = peewee.ForeignKeyField(User)
text = peewee.TextField()
class Like(peewee.Model):
user = peewee.ForeignKeyField(User)
post = peewee.ForeignKeyField(Post)
time = peewee.DateTimeField(default=datetime.datetime.now)
Run Code Online (Sandbox Code Playgroud)
我从 Like 模型的角度进行查询,从Like.select()
并连接Post
模型开始查询。可以吗?我如何从Post
模型的角度进行查询,即Post.select()...
?
为了方便起见,这里有一个完整的示例:
def check_likes():
user, _ = User.get_or_create(name="John")
post, _ = Post.get_or_create(text="Hello world!", user=user)
like, _ = Like.get_or_create(post=post, user=user)
print("Created: ", user, post, like)
# Get liked posts for user
query_likes = (Like.select()
.where(Like.user == user)
.join(User)
.join(Post))
liked_posts …
Run Code Online (Sandbox Code Playgroud)