使用一个模型在Django中过滤另一个模型

时间:2014-05-05 17:02:50

标签: python django

我试图根据我的gadb_vote模型中的action_ids访问我的gadb_action模型中的信息。我最初只是获取特定立法者的信息,然后试图获得与立法者投票所采取的行动相关的法案。

现在,我的action_list只存储action_ids,但不存储我想在模板中使用的gadb_action模型中的相关信息。

在模板访问的for循环之外存储该信息的最佳方法是什么?有没有办法写一个空的QuerySet?

提前感谢您提供的任何帮助!

视图

def each_member(request,legislator_id):
    each_member = get_object_or_404(gadb_legislator, legislator_id=legislator_id)
    each_vote = gadb_vote.objects.filter(legislator_id=legislator_id)
    action_list = []

    for i in each_vote:
        action = gadb_action.objects.filter(action_id=i.action_id)
        action_list.append(action)

    context = {
        'each_member': each_member,
        'each_vote': each_vote,
        'action_list': action_list
    }

    return render(request, "eachmember.html", context)

模型

class gadb_action(models.Model):
    action_id = models.IntegerField(unique=False, max_length=4, primary_key=True)
    bill_id = models.IntegerField(unique=False, max_length=12)

class gadb_vote(models.Model):
    vote_id = models.IntegerField(unique=False, max_length=11,primary_key=True)
    legislator_id = models.IntegerField(unique=False, max_length=11)
    action_id = models.IntegerField(unique=False, max_length=11)

模板

{% for i in action_list %}
    {{i.bill_id}}
    {{i.action_id}}
{% endfor %}

1 个答案:

答案 0 :(得分:1)

你的模特坏了。

首先,虽然它与问题没有直接关系,但您需要将主键定义为AutoFields,以便每次添加新实体时自动增加它们。否则,在保存新行时,您将收到各种错误。 (更好的是,根本不要定义PK,让Django自动添加它。)

其次,正如lalo所说,你应该有从行动到比尔的外国人,从投票到行动和投票到立法者。这样,您可以通过单个查询获取相关信息,并按照模板中的要求执行外键。

(此外,Django已在基础表名称中包含应用名称:无需使用' gadb'前缀所有内容。)

class Action(models.Model):
    bill = models.ForeignKey(Bill)

class Vote(models.Model):
    legislator = models.ForeignKey(Legislator)
    action = models.ForeignKey(Action)

查看:

def each_member(request,legislator_id):
    actions = Action.objects.filter(vote__legislator_id=legislator_id)
    return render(request, "eachmember.html", {'action_list': actions})

模板:

{% for action in actions %}
    {{ action.bill.name }}
    {{ action.someotherfield }}
{% endfor %}