2013-07-17 35 views
1

我有兩個模型用戶,細節和技能。在技​​能表中可以爲特定用戶存儲「n」個技能。在過濾時顯示唯一的用戶詳細信息,但不顯示按鍵技能。我用一對一的現場技能模型,但多個用戶是不能接受的,所以我使用foriegn鍵that.For例如..Django過濾來自不同模型的數據

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

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

OneToOneFieldDetails模型此不同。

此外,您的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)) 

它會產生同樣的效果。