- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否可以使用 Django 的 ORM 以编程方式连接两个表?我有两个模型:主题和投票。在我的模板上,我有一个主题列表,用户可以像 Reddit 一样向上/向下投票。除了对结果进行排序之外,一切都按预期进行。我无法弄清楚如何根据分数(每个对象的投票数之和)对对象列表进行排序。我可以毫无问题地从 postgres 检索所需的数据:
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;
它返回所需的结果:
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
问题是,我不确定如何将其作为查询集检索。目前我正在使用以下内容来显示对象:
topic_list = Topic.objects.all()
除了排序顺序之外,一切都按照我想要的方式显示。我希望首先显示最高分。
我已经看过的资源: https://docs.djangoproject.com/en/dev/topics/db/managers/#adding-extra-manager-methods
How to query as GROUP BY in django?
还有更多,但作为新用户,反垃圾邮件阻止我添加它们。
我尝试过的事情:
链:
listed_links = list(chain(topic, score))
不幸的是,如果我尝试添加排序值,就会失败。
组合对象列表:
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)
这导致我想要的所有对象都出现在一个列表中,但我无法弄清楚如何将 topic.id
链接到 score.object_id
。
我也尝试过插入原始 SQL,但我觉得我做得不正确,并且可能导致第三方 SQL 注入(inject)。
我很乐意将这一结果分享给 django-voting 项目。就像我说的,一切都按预期进行,除了我不知道如何按分数降序排序。
============投票==========================
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
============主题模型==========================
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
最佳答案
我能够使用此处描述的补丁找到解决方案:
http://code.google.com/p/django-voting/issues/detail?id=10
不同之处在于我提取了以下几行:
def select_score(self):
""" Add vote scores for objects in resoultset """
from django.contrib.contenttypes.models import ContentType
model_type = ContentType.objects.get_for_model(self.model)
table_name = self.model._meta.db_table
print type(model_type)
print model_type.id
return self.extra(select={'score': 'SELECT SUM(vote) FROM votes WHERE content_type_id=%i AND object_id=%s.id' % (int(model_type.id), table_name)})
并将它们添加到 voting/managers.py 文件中,如下所示:
class VoteManager(models.Manager):
def get_score(self, obj):
"""
Get a dictionary containing the total score for ``obj`` and
the number of votes it's received.
"""
ctype = ContentType.objects.get_for_model(obj)
result = self.filter(object_id=obj._get_pk_val(),
content_type=ctype).extra(
select={
'score': 'COALESCE(SUM(vote), 0)',
'num_votes': 'COALESCE(COUNT(vote), 0)',
}).values_list('score', 'num_votes')[0]
return {
'score': int(result[0]),
'num_votes': int(result[1]),
}
然后在我的topic.views.py中我添加了以下内容:
from voting.managers import VoteManager
def index(request):
queryset = Topic.objects.select_score().order_by('-score')
paginator = Paginator(queryset, 3) # Show 25 contacts per page
page = request.GET.get('page')
try:
topic_list = paginator.page(page)
except PageNotAnInteger:
# If page is not an integer, deliver first page.
topic_list = paginator.page(1)
except EmptyPage:
#If page is out of range (e.g. 9999), deliver last page of results.
topic_list = paginator.page(paginator.num_pages)
c = Context({
'topic_list': topic_list,
'request': request
})
return render_to_response('idea/index.html', c, context_instance=RequestContext(request))
最后,在我的 index.html 中,我添加了以下几行,与为用户提供的原始示例略有不同:
{% load voting_tags %}
{% votes_by_user user on topic_list as vote_dict %}
{% scores_for_objects topic_list as score_dict %}
<table id="voting_table" class="list">
<tbody>
{% for link in topic_list %}
<td class="vote">
{% dict_entry_for_item link from vote_dict as vote %}
{% dict_entry_for_item link from score_dict as score %}
<div>
<form class="linkvote" id="linkup{{ link.id }}"{% if vote and vote.is_upvote %} action="{% url link_vote object_id=link.id, direction="clear" %}"{% else %} action="{% url link_vote object_id=link.id, direction="up" %}"{% endif %} method="POST">
<input type="image" id="linkuparrow{{ link.id }}" src="{{ STATIC_URL }}images/aup{% if vote and vote.is_upvote %}mod{% else %}grey{% endif %}.png">
{% csrf_token %}
<input type="hidden" name="next" value="{{ request.get_full_path }}"/>
{% else %}
</form>
<div id="link_score">{{ score.score|default:0 }}</div>
<form class="linkvote" id="linkdown{{ link.id }}" {% if vote and vote.is_downvote %} action="{% url link_vote object_id=link.id, direction="clear" %}"{% else %} action="{% url link_vote object_id=link.id, direction="down" %}"{% endif %} method="POST">
{% csrf_token %}
<input type="image" id="linkdownarrow{{ link.id }}" src="{{ STATIC_URL }}images/adown{% if vote and vote.is_downvote %}mod{% else %}grey{% endif %}.png">
<input type="hidden" name="next" value="{{ request.get_full_path }}"/>
</td>
<td class="item">
<a id="link_title" href="{{ link.id }}">{{ link.title|escape }}</a></h2>
<p class="details">
<span class="score" id="linkscore{{ link.id }}"
title="after {{ score.num_votes|default:0 }} vote{{ score.num_votes|default:0|pluralize }}">
</span>
posted {{ link.date_created|timesince }} ago by
<span class="user"><a href="../users/{{ link.user.id }}/">{{ link.owner|escape }}</a></span>
{% get_comment_count for link as comment_count %}
<span id="comment_score" class="comment_details"> {{ comment_count }} comment{{ comment_count|pluralize }}</span>
</p>
</td>
</tr>{% endfor %}
</tbody>
<td>
<div id="paginator" class="pagination">
<span class="step-links">
{% if topic_list.has_previous %}
<a href="?page={{ topic_list.previous_page_number }}">previous</a>
{% endif %}
{% if topic_list.has_next %}
<a href="?page={{ topic_list.next_page_number }}">next</a>
{% endif %}
</span>
</div>
</td>
</table>
编辑
我差点忘了!如果您希望列表按 2,1,0,-1,-2 等顺序排序,请确保在提交您正在创建的任何对象时设置投票对象值。下面的示例来 self 的 topic.views.py。
def submit_topic(request):
if request.method == 'POST':
post_topic = PosttopicForm(request.POST)
owner = request.user
if post_topic.is_valid():
topic = post_topic.save(commit=False)
topic.owner = request.user
topic.save()
vote = Vote(vote='0', user = request.user, content_type_id=10, object_id=topic.pk)
vote.save()
url = reverse('topic', args=[topic.pk, topic.slug])
return HttpResponseRedirect(url)
else:
post_topic = PosttopicForm()
c = Context({
'form': post_topic,
'user': request.user,
'request': request,
})
return render_to_response('topic/submit.html', c, context_instance=RequestContext(request))
我真的希望这对其他人有帮助。抱歉没有早点发布解决方案。希望有人可以通过从 VoteManager 中删除 SQL 来改进这一点,但我需要继续前进。
关于django - 如何使用 Django 连接两个表而不使用原始 sql?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11073698/
我有一台 MySQL 服务器和一台 PostgreSQL 服务器。 需要从多个表中复制或重新插入一组数据 MySQL 流式传输/同步到 PostgreSQL 表。 这种复制可以基于时间(Sync)或事
如果两个表的 id 彼此相等,我尝试从一个表中获取数据。这是我使用的代码: SELECT id_to , email_to , name_to , status_to
我有一个 Excel 工作表。顶行对应于列名称,而连续的行每行代表一个条目。 如何将此 Excel 工作表转换为 SQL 表? 我使用的是 SQL Server 2005。 最佳答案 这取决于您使用哪
我想合并两个 Django 模型并创建一个模型。让我们假设我有第一个表表 A,其中包含一些列和数据。 Table A -------------- col1 col2 col3 col
我有两个表:table1,table2,如下所示 table1: id name 1 tamil 2 english 3 maths 4 science table2: p
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 1 年前。 Improve th
下面两个语句有什么区别? newTable = orginalTable 或 newTable.data(originalTable) 我怀疑 .data() 方法具有性能优势,因为它在标准 AX 中
我有一个表,我没有在其中显式定义主键,它并不是真正需要的功能......但是一位同事建议我添加一个列作为唯一主键以随着数据库的增长提高性能...... 谁能解释一下这是如何提高性能的? 没有使用索引(
如何将表“产品”中的产品记录与其不同表“图像”中的图像相关联? 我正在对产品 ID 使用自动增量。 我觉得不可能进行关联,因为产品 ID 是自动递增的,因此在插入期间不可用! 如何插入新产品,获取产品
我有一个 sql 表,其中包含关键字和出现次数,如下所示(尽管出现次数并不重要): ____________ dog | 3 | ____________ rat | 7 | ____
是否可以使用目标表中的LAST_INSERT_ID更新源表? INSERT INTO `target` SELECT `a`, `b` FROM `source` 目标表有一个自动增量键id,我想将其
我正在重建一个搜索查询,因为它在“我看到的”中变得多余,我想知道什么 (albums_artists, artists) ( ) does in join? is it for boosting pe
以下是我使用 mysqldump 备份数据库的开关: /usr/bin/mysqldump -u **** --password=**** --single-transaction --databas
我试图获取 MySQL 表中的所有行并将它们放入 HTML 表中: Exam ID Status Assigned Examiner
如何查询名为 photos 的表中的所有记录,并知道当前用户使用单个查询将哪些结果照片添加为书签? 这是我的表格: -- -- Table structure for table `photos` -
我的网站都在 InnoDB 表上运行,目前为止运行良好。现在我想知道在我的网站上实时发生了什么,所以我将每个页面浏览量(页面、引荐来源网址、IP、主机名等)存储在 InnoDB 表中。每秒大约有 10
我在想我会为 mysql 准备两个表。一个用于存储登录信息,另一个用于存储送货地址。这是传统方式还是所有内容都存储在一张表中? 对于两个表...有没有办法自动将表 A 的列复制到表 B,以便我可以引用
我不是程序员,我从这个表格中阅读了很多关于如何解决我的问题的内容,但我的搜索效果不好 我有两张 table 表 1:成员 id*| name | surname -------------------
我知道如何在 ASP.NET 中显示真实表,例如 public ActionResult Index() { var s = db.StaffInfoDBSet.ToList(); r
我正在尝试运行以下查询: "insert into visits set source = 'http://google.com' and country = 'en' and ref = '1234
我是一名优秀的程序员,十分优秀!