2016-02-27 83 views
1
class Post(models.Model): 
    created_time = models.DateTimeField() 
    comment_count = models.IntegerField(default=0) 
    like_count = models.IntegerField(default=0) 
    group = models.ForeignKey(Group) 

class MonthPost(models.Model): 
    created_time = models.DateTimeField() 
    comment_count = models.IntegerField(default=0) 
    like_count = models.IntegerField(default=0) 
    group = models.ForeignKey(Group) 
    post = models.OneToOneField(Post) 

我使用這兩個模型。 MonthPost是Post的一部分。 當過濾日期小於月份時,我想使用MonthPost。django模型中提取OneToOne字段

_models = Model.extra(
      select={'score': 'like_count + comment_count'}, 
      order_by=('-score',) 
     ) 

我使用額外約兩個以上的模型。郵政運作良好,但MonthPost不起作用。

django.db.utils.ProgrammingError: column reference "like_count" is ambiguous 
LINE 1: ... ("archive_post"."is_show" = false)) ORDER BY (like_count... 

這是錯誤消息。

_models.values_list("post", flat=True) 

然後,我想從MonthPost中提取OneToOne字段(post)。 我嘗試使用values_list(「post」,flat = True)。它只返回id列表。 我需要發佈django rest框架的對象列表。

回答

0

我不太理解你想用你的MonthPost模型實現什麼,以及它爲什麼複製Post域。有了這樣的說法,我認爲你可以用這個信息得到你想要的結果。

首先extra折舊請參見docs on extra。在這兩種情況下,你的選擇是不是有效的SQL語法,查詢應該看起來更像是這樣的:

annotate(val=RawSQL(
      "select col from sometable where othercol =%s", 
      (someparam,))) 

但是,你在這裏以後有什麼需要額外既不或RawSql。這些方法只能用於沒有內置方法來實現預期結果的情況。當使用RawSql或額外的時候,你必須爲你的特定支持定製SQL。 Django的已建成的方法此類查詢:

qs = Post.objects.all().annotate(
    score=(Count('like_count') + Count('comment_count')) 

一個values_list()查詢需要明確列出從相關模型和額外的或註釋字段中的所有領域。對於MonthPost它應該是這樣的:

MonthPost.objects.all().values_list('post', 'post__score', 'post__created_time') 

最後,如果MonthPost的目的只是列出的職位與他最偉大的得分給定月份,就可以完全消除MonthPost模型和查詢後您的模型這個。

import datetime 
today = datetime.date.today() 

# Filter for posts this month 
# Annotate the score 
# Order the results by the score field 
qs = Post.objects\ 
     .filter(created_time__year=today.year, created_time__month=today.month)\ 
     .annotate(score=(Count('like_count') + Count('comment_count'))\ 
     .order_by('score') 

# Slice the top ten posts for the month 
qs = qs[:10] 

上面的代碼沒有測試,但應該給你關於如何執行這些類型的查詢更好地處理。