2016-02-27 2 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, когда дата фильтрации меньше месяца.Экстракт 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) 

И затем, я хочу извлечь поле OneToOne (post) из MonthPost. Я пытаюсь использовать values_list («post», flat = True). Он возвращает только идентификационный список. Мне нужно опубликовать список объектов для рамки django rest.

ответ

0

Я не совсем понимаю, чего вы пытаетесь достичь с помощью модели MonthPost и почему она дублирует поля Post. С учетом сказанного я думаю, что вы можете получить результаты, которые вы хотите, с этой информацией.

Прежде всего extra обесценивается, см. docs on extra. В любом случае, ваш выбор не является допустимым синтаксисом SQL, запрос должен выглядеть следующим образом:

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

Однако то, что вы после этого здесь не требует ни дополнительного или RawSql. Эти методы следует использовать только тогда, когда нет встроенного способа достижения желаемых результатов. При использовании RawSql или extra вы должны адаптировать 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] 

Код, указанный выше, не проверен, но должен дать вам более четкое представление о том, как выполнять эти типы запросов.