Есть ли способ упростить этот рабочий код? Этот код получает для объекта все разные типы голосования, есть 20 возможных и подсчитывает каждый тип. Я предпочитаю не писать raw sql, а использовать orm. Это немного сложнее, потому что я использую общий внешний ключ в модели.map raw sql to django orm
def get_object_votes(self, obj):
"""
Get a dictionary mapping vote to votecount
"""
ctype = ContentType.objects.get_for_model(obj)
cursor = connection.cursor()
cursor.execute("""
SELECT v.vote , COUNT(*)
FROM votes v
WHERE %d = v.object_id AND %d = v.content_type_id
GROUP BY 1
ORDER BY 1 """ % (obj.id, ctype.id)
)
votes = {}
for row in cursor.fetchall():
votes[row[0]] = row[1]
return votes
Модели им с помощью
class Vote(models.Model):
user = models.ForeignKey(User)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
payload = generic.GenericForeignKey('content_type', 'object_id')
vote = models.IntegerField(choices = possible_votes.items())
class Issue(models.Model):
title = models.CharField(blank=True, max_length=200)
Объект голосования использует ключевой ключ для ключей, я хочу иметь возможность проголосовать за любой объект. Я также добавлю код модели. – Stephan
Предполагаю, вы расследовали внешние отношения? Они позволяют вам напрямую создавать нужный объект. Пример выглядит так, как будто может быть ответ. http://www.djangoproject.com/documentation/models/generic_relations/ – AlbertoPL