Python django与where子句子表达式的左连接

Python django与where子句子表达式的左连接,python,django,join,django-queryset,where-clause,Python,Django,Join,Django Queryset,Where Clause,我目前正在尝试用Django(v1.10)的ORM做一些事情,我觉得这应该是可能的,但我很难理解如何应用文档化的方法来解决我的问题 编辑:在我意识到我原来的sqlite3支持的sql查询不正确后,这里是我破解的sql,用于返回我希望从dbshell返回的数据,现在使用postgresql数据库: select voting_bill.*,vv.vote from voting_bill left join (select voting_vote

我目前正在尝试用Django(v1.10)的ORM做一些事情,我觉得这应该是可能的,但我很难理解如何应用文档化的方法来解决我的问题

编辑:在我意识到我原来的sqlite3支持的sql查询不正确后,这里是我破解的sql,用于返回我希望从
dbshell
返回的数据,现在使用postgresql数据库:

select 
    voting_bill.*,vv.vote 
from 
    voting_bill 
left join 
    (select 
        voting_votes.vote,voting_votes.bill_id 
    from 
        voting_bill 
    left join 
        voting_votes 
    on 
        voting_bill.id=voting_votes.bill_id 
    where 
        voting_votes.voter_id = (select id from auth_user where username='richard' or username is Null)
   ) 
as 
    vv 
on 
    voting_bill.id=vv.bill_id;
以下是我的投票应用程序的“models.py”:

from django.db import models
from django.contrib.auth.models import User


class Bill(models.Model):
    name = models.CharField(max_length=255)
    description = models.TextField()
    result = models.BooleanField()
    status = models.BooleanField(default=False)

    def __str__(self):
        return self.name


class Votes(models.Model):
    vote = models.NullBooleanField()
    bill = models.ForeignKey(Bill, related_name='bill',
                             on_delete=models.CASCADE,)
    voter = models.ForeignKey(User, on_delete=models.CASCADE,)

    def __str__(self):
        return '{0} {1}'.format(self.bill, self.voter)
我可以看到,我的sql与我期望的一样工作,投票被固定在末尾,如果用户还没有投票,则为null

我正努力使queryset采用这种格式,以便我可以在模板中对其进行迭代以生成一个表,如果结果为null,我可以提供一个链接,将用户带到另一个视图


我已经读过与select和prefetch相关的内容,但正如我所说的,我正在努力解决如何将其转换为如何在SQL中实现这一点。

希望我正确理解了您的问题。试试这个:

votes = Votes.objects.filter(voter__username='django').select_related('bill')
你可以用这个。但我认为在这种情况下,您不需要
选择\u related

bills_for_user = Bill.objects.filter(votes__voter__username='django').select_related('votes').distinct()
现在您可以为用户迭代账单

for bill in bills_for_user:
    bill_name = bill.name
    bill_description = bill.description
    bill_result = bill.result
    bill_status = bill.status

    # and there are several variants what you can with votes
    bill_votes = bill.votes_set.all()  # will return you all votes for this bill
    bill_first_vote1 = bill.votes_set.first() # will return first element in this query or None if its empty
    bill_first_vote2 = bill.votes_set.all()[0] # will return first element in this query or Error if its empty
    bill_last_vote = bill.votes_set.last()[0] # will return last element in this query or None if its empty
    # you can also filter it for example by voting
    bill_positive_votes = bill.votes_set.filter(vote=True) # will return you all votes for this bill with 'vote' = True
    bill_negative_votes = bill.votes_set.filter(vote=False) # will return you all votes for this bill with 'vote' = False
    bill_neutral_votes = bill.votes_set.filter(vote=None) # will return you all votes for this bill with 'vote' = None

嗯,如果我读对了,我想这不会满足我的要求。我想退还所有的账单,但我想像你在那里做的那样保留选票的过滤器。我有点想要这样的东西:bills\u for\u user=bills.objects。选择与之相关的(‘投票’)。过滤(投票)\u选民=request.user)编辑。现在,您可以使用
bills=Bill.objects.filter(投票人\uu投票人\uu id=request.user.id)遍历bills查询集。选择\u related('投票').distinct()
无法将关键字“投票”解析到字段中。选项包括:账单、描述、id、姓名、结果、状态
出于某种原因,我似乎无法编辑评论,但代码后面会显示一条错误消息。基本上,它似乎不喜欢某个地方的投票,无论是在选择相关还是在过滤器中。我一直在玩,但大多数时候我都不能让select与Bill模型相关,因为它与FK相反?FK在编辑的投票模型上。您的投票模型中缺少“相关名称”。这有点迷失方向,因为通常
相关的\u name
使用与模型名相同的名称,以使其在反向关系中更易于人阅读,但在您的情况下,您将有
Bill
的实例,该实例具有
Bill
属性,这实际上是
投票
设置的。