Django过滤对象并获取第一个对应的值

问题描述:

我有两个模型。Django过滤对象并获取第一个对应的值

class House(models.Model): 
    name= models.Charfield(max_length=100) 
    city= models.Charfield(max_length=100) 
    area= models.CharField(max_length=200) 
    country=models.CharField(max_length=30) 

class HouseRooms(models.Model): 
    room_name=models.Charfield(max_length=200) 
    house= models.ForeignKey(House, related_name='house_hr') 
    room_price=models.PositiveIntegerField() 

当用户运行一个关键字搜索,我要回各“家”和相应的“HouseRooms”的第一room_price的名称。见下面我的看法。

def my_house_search(request): 
    query_string= '' 
    rms= None 
    sms=None 
    if ('q' in request.GET) and request.GET['q'].strip(): 
     query_string = request.GET['q'] 

     entry_query= get_query(query_string, ['city','country',]) 

     rms= House.objects.filter(entry_query).order_by('-pub_date') 
     sms= HouseRooms.objects.filter(house_id__in=rms) 


     return render(request, 'search/my_house_search.html',{'rms':rms, 'sms':sms, 'query_string':query_string}) 

模板:

{% if query_string %} 
    <p> Results </p> 


    {% if rms %} 
     {% for m in rms %} 
     <p> Name: {{ m.name }} </p> 
     {% empty %} 
      <p> No house found </p> 
     {% endfor %} 

     {% for sd in sms %} 
     <p> price: {{ sd.room_price }} for {{sd.room_name}}</p> 
     {% empty %} 
     <p> no price found </p> 
     {% endfor %} 

    {% endif %} 

    {% endif %} 

随着我写的代码,它将返回每家的名称,并显示所有的价格都这样的房子:

Coker House 

Klopp House 

$50/day for small room 
$100/day for medium room 
$200/day for big room 

$200/day for quack room 
$400/day for master room 
$500/day for big room 

我只是想它会像这样返回结果。

Coker House 
$50/day for small room 

Klopp House 
$200/day for quack room 

我在想什么?我如何去做这件事?

您不应该在视图中显式查询HouseRooms。相反,您可以在模板本身的迭代中使用反向关系访问器。

{% for m in rms %} 
    <p> Name: {{ m.name }} </p> 
    {% with m.house_hr.first as sd %} 
    {% if sd %} 
     <p> price: {{ sd.room_price }} for {{sd.room_name}}</p> 
    {% else %} 
     <p> no price found </p> 
    {% endif %} 
    {% endwith %} 
{% empty %} 
    <p> No house found </p> 
{% endfor %} 
+0

你摇滚丹尼尔。工作中。谢谢。 – YoYo