Có thể lập trình tham gia hai bảng bằng ORM của Django không? Tôi có hai mô hình: Chủ đề và phiếu bầu. Trên mẫu của tôi, tôi có một danh sách các chủ đề mà người dùng có thể lên/xuống bỏ phiếu như Reddit. Tất cả mọi thứ hoạt động như nó nên ngoại trừ việc phân loại kết quả. Tôi không thể tìm ra cách sắp xếp một danh sách các đối tượng dựa trên số điểm đó là tổng số phiếu bầu của mỗi đối tượng. Tôi có thể lấy dữ liệu mong muốn từ Postgres mà không cần bất kỳ vấn đề:Làm thế nào để bạn tham gia hai bảng bằng cách sử dụng Django mà không cần sử dụng sql thô?
select i.id, i.title, i.date_created, s.object_id, s.vote, Sum(vote)
from topic_topic i, votes s
where i.id = s.object_id
group by 1, 2, 3, 4, 5
order by sum DESC;
Nó trả về kết quả mong muốn:
id | title | date_created | object_id | vote | sum
11 | sdfg | 2012-06-04 23:30:17.805671-07 | 11 | 1 | 2
1 | test | 2012-05-13 17:03:24.206092-07 | 1 | 1 | 2
3 | asdf | 2012-05-13 19:23:15.059135-07 | 3 | 1 | 2
2 | adsf | 2012-05-13 19:21:34.180905-07 | 2 | 1 | 2
12 | 11 | 2012-06-04 23:30:54.759158-07 | 12 | 1 | 2
9 | asfd | 2012-05-24 00:26:26.705843-07 | 9 | -1 | -1
4 | asdf | 2012-05-14 19:59:52.450693-07 | 4 | -1 | -2
Vấn đề là, tôi không chắc chắn làm thế nào để lấy lại điều này như một queryset. Hiện tại, tôi đang sử dụng các mục sau để hiển thị các đối tượng:
topic_list = Topic.objects.all()
Mọi thứ hiển thị như tôi muốn, ngoại trừ thứ tự sắp xếp. Tôi muốn số điểm cao nhất để hiển thị đầu tiên.
Tài nguyên Tôi đã xem xét: https://docs.djangoproject.com/en/dev/topics/db/managers/#adding-extra-manager-methods
How to query as GROUP BY in django?
Và nhiều hơn nữa, nhưng như một người dùng mới, chống thư rác ngăn cản tôi từ thêm chúng.
Thing của tôi đã cố gắng:
Chain:
listed_links = list(chain(topic, score))
Thật không may, nếu tôi cố gắng thêm một giá trị được sắp xếp này đã phá vỡ.
Kết hợp danh sách đối tượng:
topic = Topic.objects.all().values_list('user','id', 'title','slug', 'date_created', 'date_updated',)
score = Vote.objects.values('object_id').annotate(total=Sum('vote')).order_by('-total')
results = []
for topic in topic:
results.append(topic)
for score in score:
results.append(topic)
Điều này dẫn đến tất cả các đối tượng tôi muốn trong một danh sách, nhưng tôi không thể tìm ra cách để liên kết topic.id
-score.object_id
.
Tôi cũng đã thử chèn SQL thô, nhưng tôi không cảm thấy như tôi đang thực hiện nó một cách chính xác và có thể dẫn đến việc SQL injection bởi bên thứ ba.
Tôi rất muốn chia sẻ kết quả của dự án này với dự án bỏ phiếu django. Như tôi đã nói, mọi thứ hoạt động như nó cần, ngoại trừ tôi không thể tìm ra cách sắp xếp theo điểm số desc.
============= Bỏ phiếu ========================
from django.contrib.contenttypes import generic
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.models import User
from django.db import models
from voting.managers import VoteManager
from voting.VotedObjectsManager import VotedObjectsManager
SCORES = (
(+1, u'+1'),
(-1, u'-1'),
)
class Vote(models.Model):
"""
A vote on an object by a User.
"""
user = models.ForeignKey(User)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
object = generic.GenericForeignKey('content_type', 'object_id')
vote = models.SmallIntegerField(choices=SCORES)
objects = VoteManager()
class Meta:
db_table = 'votes'
# One vote per user per object
unique_together = (('user', 'content_type', 'object_id'),)
def __unicode__(self):
return u'%s: %s on %s' % (self.user, self.vote, self.object)
def is_upvote(self):
return self.vote == 1
def is_downvote(self):
return self.vote == -1
============= Topic mẫu ========================
from django.db import models
from datetime import datetime
from tinymce import models as tinymce_models
from django.forms import ModelForm
from django.template.defaultfilters import slugify
from tagging.fields import TagField
from tagging.models import Tag
from django.contrib.auth.models import User
from django.utils.translation import ugettext_lazy as _
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
from django.core import urlresolvers
class Topic(models.Model):
title = models.CharField(max_length=50)
slug = models.SlugField(max_length=50, editable=False)
topic = tinymce_models.HTMLField()
date_created = models.DateTimeField(editable=False)
date_updated = models.DateTimeField(editable=False)
tags = TagField()
def set_tags(self, tags):
Tag.objects.update_tags(self, tags)
def __unicode__(self):
return self.tags
def __unicode__(self):
return self.id
def __unicode__(self):
return self.title
Các mô hình là ...? –
Tôi đã thêm các mô hình. Cảm ơn vì đã phản hồi nhanh. – user1462141