Джанго проблема родовых отношений - PullRequest
0 голосов
/ 06 июля 2011

У меня проблемы с созданием фильтра в одном из моих просмотров.Я создаю сайт с записями в блогах, новостными статьями и обзорами.Записи и статьи имеют общие отношения с рецензиями, потому что рецензии могут пометить любой из них.Я пытаюсь отсортировать записи / статьи на основе суммы оценок отзывов новее определенной даты .

Вотупрощенные модели:

class Entry(models.Model):
    name = models.CharField(max_length=50)
    reviews = generic.GenericRelation(Review)

class Article(models.Model):
    name = models.CharField(max_length=50)
    reviews = generic.GenericRelation(Review)

class Review(models.Model):
    rating = models.IntegerField()
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    target = generic.GenericForeignKey('content_type', 'object_id')
    timestamp = models.DateTimeField(auto_now_add=True)

Итак, учитывая, что мне нужно было найти сумму, я попытался использовать аннотирование и агрегирование, но столкнулся с двумя проблемами.Во-первых, очевидно, что родовые отношения и аннотации не очень хорошо работают вместе: https://code.djangoproject.com/ticket/10461. Во-вторых, я не думаю, что возможно суммировать только часть обзоров (в данном случае с timestamp__gte =datetime.now ()).Я делаю это неправильно?

Я также думал о том, чтобы сделать это наоборот:

Review.filter(timestamp__gte=datetime.now(), target__in=something).aggregate(Sum('rating'))

Но так как я пытаюсь заказать обзоры, основанные на этом, неt Мне нужно начать с Review.something, чтобы я мог использовать order_by?

Спасибо.

Ответы [ 2 ]

1 голос
/ 06 июля 2011

Я бы настоятельно рекомендовал использовать Многостоловое наследование вместо общих внешних ключей:

class ReviewedItem(models.Model):
    item_type = models.IntegerField() # exclude me on admin
    def save(self):
        self.item_type = self.ITEM_TYPE
        super(ReviewedItem, self).save()

class Entry(ReviewedItem):
    ITEM_TYPE = 1
    name = models.CharField(max_length=50)

class Article(ReviewedItem):
    ITEM_TYPE = 2
    name = models.CharField(max_length=50)

class Review(models.Model):
    item = models.ForeignKey(ReviewedItem)
    rating = models.IntegerField()
    timestamp = models.DateTimeField(auto_now_add=True)
0 голосов
/ 19 июля 2011

Проведя некоторое исследование, я обнаружил, что единственный способ решить мою проблему - написать собственный sql с использованием «дополнительного» метода QuerySets.

...