我有两个模型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 %}
通过提供上面的代码,除了技能之外,它的所有功能都很好。
答案 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))
它会产生同样的效果。