Django过滤来自不同模型的数据

时间:2013-07-17 07:04:31

标签: django python-2.7

我有两个模型User,Details和Skills。在技​​能表中可以为特定用户存储“n”个技能。在过滤时,它显示唯一的用户详细信息,但不显示键功能。我在技能模型中使用一对一字段,但不接受多个用户,因此我使用foriegn键。例如..

User Table

id | name
---|-----
1  | abc


Details table

id | user_id | city
---|---------|-----
1  |   1     | NY


Skills Table

id | user_id | skill
---|---------|-----
1  |   1     | C
2  |   1     | c++
3  |   1     | java

我想根据技能或城市进行过滤。如果它匹配任何一个应显示整个细节。我添加模型和视图请分享您的想法

模型

class User(models.Model):
    name = models.CharField(max_length=100)


class Details(models.Model):
    user = models.OneToOneField(User)
    city = models.CharField(max_length=100, blank=True, null=True)

class Skills(models.Model):
    user = models.ForeignKey(User)
    skill = models.CharField(max_length=100, blank=True, null=True)

视图

search = request.GET['keywords']
searchlist = search.split(",")
list_result= []

for search in searchlist:
    for res in User.objects.filter(Q(Skills__skill__icontains=search) | Q(Details__city__icontains=search)):
        if not res in list_result:
            list_result.append(res)
users = list_result

return render_to_response('Result.html',{'details':users},context_instance=RequestContext(request))

模板

{% for d in details %}
{{ d.name }}
{{ d.Skills.skill }}
{{ d.Details.city }}
{% endfor %}

通过提供上面的代码,除了技能之外,它的所有功能都很好。

1 个答案:

答案 0 :(得分:1)

Skills模型是ForeignKey字段,这意味着您必须通过其_set属性访问它。

在你的情况下,它是skills_set。所以你的正确模板语法是

{% for user in details %}
    name: {{ user.name }}<br/>
    {% for skill in user.skills_set.all %}
    skill: {{ skill.skill }}<br/>
    {% endfor %}
   city: {{ user.details.city }}
{% endfor %}

这与您OneToOneField模型的Details不同。

此外,您的QuerySet有问题。您不应该尝试Q模型而是实际字段。所以你当前的查询集应该是这样的:

User.objects.filter(Q(skills__skill__icontains=search) | Q(details__city__icontains=search))

除此之外,你真的不应该把你的东西标记为真实的东西。 您将users命名为details,当您遍历Users对象时,这实在令人困惑。您也可以将整个视图代码切换到此

users = User.objects.filter(Q(skills__skill__icontains=search) | Q(details__city__icontains=search))

它会产生同样的效果。