1

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

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 %}

通过提供上面的代码,它的工作一切正常,除了技能没有显示。

4

1 回答 1

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 %}

这与您的OneToOneFieldforDetails模型不同。

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

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

除此之外,你真的不应该给你的东西贴上真正的标签。当您遍历对象时,您已经命名usersdetailswhich 确实令人困惑。Users您也可以将整个视图代码切换到此

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

它会产生同样的效果。

于 2013-07-17T16:43:09.877 回答