Py学习  »  问与答

求助:views查询出来一个list里怎么查询另一个?

流离的宿命 • 9 年前 • 3080 次点击  

问题可能有点低级,但是一时不知道怎么解决的,所以来求助。

现在有A、B两个model

class A(models.Model):
    A1 = models.CharField(max_length=30)
    A2 = models.CharField(max_length=30)

class B(models.Model):
    B1 = models.CharField(max_length=30)
    B2 = models.ForeignKey(A)

我在views.py里查询出A的一个list:

def(request):
    a_list = A.objects.all()
    return render_to_response('1.html',{'a_list':a_list})

然后在templates里调用:

{% for a in a_list}
    {{ a.A1 }}
    {{ a.A2 }}
{% endfor %}

接下我希望在这个循环内用A2字段筛选一个B的list该如何操作,大体像这样:

全选复制放进笔记

 {% for a in a_list}
        {{ a.A1 }}
        {{ a.A2 }}
        {% for b in b_list%}
            {{ b.B1 }}
            {{ b.B2 }}
        {% endfor%}
{% endfor %}
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/1327
 
3080 次点击  
文章 [ 8 ]  |  最新文章 9 年前
流离的宿命
Reply   •   1 楼
流离的宿命    9 年前

@MCC 然而要做排序和限定数量还得用你的方法一

MCC
Reply   •   2 楼
MCC    9 年前

我倒是没试过直接在template里面用relate,果然更简便

流离的宿命
Reply   •   3 楼
流离的宿命    9 年前

@MCC 非常感谢提供的思路,本身你的解决方法应该可以解决任何按字段筛选查询的问题,但是这个问题恰巧是多对一的关系,所以有更简便的方法。

再次感谢你的回复,以后遇到相关的调用还会回来参考你的思路。么么哒!

流离的宿命
Reply   •   4 楼
流离的宿命    9 年前

@$yann 非常感谢,这两天赶项目现在才来反馈。related_name其实是一开始就设置了,现在才知道是干这事用的。基本就是按你的代码解决的,只是有一个地方:

{% for b in a.A_relate%}

应该改为

{% for b in a.A_relate.all%}

非常感谢!

$yann
Reply   •   5 楼
$yann    9 年前
$yann
Reply   •   6 楼
$yann    9 年前

现在有A、B两个model

class A(models.Model):
    A1 = models.CharField(max_length=30)
    A2 = models.CharField(max_length=30)

class B(models.Model):
    B1 = models.CharField(max_length=30)
    B2 = models.ForeignKey(A, related_name='A_relate')

现在views.py里查询出A的一个list:

def(request):
    a_list = A.objects.all()
    return render_to_response('1.html',{'a_list':a_list})

然后在templates里调用:

 {% for a in a_list}
        {{ a.A1 }}
        {{ a.A2 }}
        {% for b in a.A_relate%}
            {{ b.B1 }}
            {{ b.B2 }}
        {% endfor%}
{% endfor %}
MCC
Reply   •   7 楼
MCC    9 年前

啊,用A2字段筛选一个B的list

不是上面那么简单

我想到的方法1:

新建一个list:

def(request):
    result = []
    a_list = A.objects.all()
    for a in a_list:
        b_list = B.objects..filter(B2=a)
        result.append({'a':a, 'b_list':b_list})
    return render_to_response('1.html',{'result':result})

 {% for r in result}
        {{ r.a.A1 }}
        {{ r.a.A2 }}
        {% for b in r.b_list%}
            {{ b.B1 }}
            {{ b.B2 }}
        {% endfor%}
{% endfor %}

方法2:

用api方式开放一个根据a查询b_list的接口,需要的时候再ajax调用

方法3:

join查询a和b,出来一大坨,和方法1差不多,然后处理下数据,和1的相比就是查询的次数少

MCC
Reply   •   8 楼
MCC    9 年前
def(request):
    a_list = A.objects.all()
    b_list = B.objects.all()
    return render_to_response('1.html',{'a_list':a_list,'b_list':b_list})