【问题标题】:django filter by two level foreign key relationshipdjango通过两级外键关系过滤
【发布时间】:2015-12-20 00:51:09
【问题描述】:
class AAA(models.Model):
    name = CharField

class BBB(models.Model):
    aaa = models.ForeignKey(AAA)
    name = CharField

class CCC(model.Model):
    bbb = models.ForeignKey(BBB)

如何在按 AAA 名称过滤 CCC 对象的视图中创建过滤器?

我知道如何为 CCC 创建过滤器以按 BBB 名称过滤:

CCC.objects.filter(bbb__name=request.bbb.name)

但我现在知道如何为两级关系创建更合适的关系(如果有意义的话)?

是吗:

CCC.objects.filter(aaa__name=request.bbb.aaa.name) ?

编辑:

models.py

class Stage(models.Model):
    project = models.ForeignKey(Project)
    slug = models.SlugField(unique=True)
    stage_number = models.CharField(max_length = 10)
    stage_name = models.CharField(max_length = 10)
    zones = models.ManyToManyField(Zone, through='ZoneStage')


class SubStage(models.Model):
    sub_name = models.CharField(max_length=10)
    stage = models.ForeignKey(Stage)
    zones = models.ManyToManyField(Zone, through='ZoneSubStage')


class ZoneSubStage(models.Model):
    zone = models.ForeignKey(Zone)
    substage = models.ForeignKey(SubStage)
    value = models.PositiveSmallIntegerField(default=0)
    slug = models.SlugField(unique=True)

views.py

这就是我使用过滤器的地方:

class ZoneSubStageUpdate(UpdateView):
    form_class = ZoneSubStageForm
    model = ZoneSubStage
    template_name = 'autostages/zonesubstage_update.html'


    def get_context_data(self, **kwargs):
        context = super(ZoneSubStageUpdate, self).get_context_data(**kwargs)
        context['slug'] = ZoneSubStage.objects.filter(substage__stage__slug=request.substage.stage.slug)
        return context    

编辑 2:

在我的views.py中,我有以下观点:

class ProjectStageDetailView(generic.DetailView):
    template_name = 'autostages/projectstagedetail.html'
    queryset = Stage.objects.all()
    context_object_name = 'stage'


    def get_context_data(self, **kwargs):
        context = super(ProjectStageDetailView, self).get_context_data(**kwargs)
        context['projects'] = Project.objects.all()
        # tutaj dac filtr aby filtrowac substage od 'stage' 
       # context['subs'] = SubStage.objects.all()
        context['subs'] = SubStage.objects.filter(stage__slug=self.kwargs['slug'])
        return context   

模板

'projectstagedetail.html'

<table border="1">
    <tr>
        <td style="width:40px" >


        <!-- print zones -->            
        {% for project in projects %}
        {% if project == stage.project %}
        {% for zone in project.zone_set.all|dictsort:"zone_name" %}
        <td style="width:40px" align="center">{{ zone.zone_name }}</td>
        {% endfor %}
        {% endif %}
        {% endfor %}  
    </tr>       


    {% for substage in subs %}
    <tr>  
        {% if substage.stage == stage %}
        <td style="width:40px">{{ substage.sub_name }}</td>
        {% else %}
        <td style="width:40px">NONE</td>
        {% endif %}



    {% for project in projects %}
    {% if project == stage.project %}
        {% for zone in project.zone_set.all|dictsort:"zone_name" %}

        <td style="width:40px" align="center">  

{% for zss in substage.zonesubstage_set.all %}
                  {% if zss.zone_id == zone.id %} 

                  <a href="{% url 'projects:zonesubstage_edit' zss.pk %}">{{ zss.value }} {{ zss.substage.stage.slug }}</a>

                    {% endif %}

                    {% endfor %}
                    </td>
{% endfor %}
{% endif %}
{% endfor %}

        </tr>
    {% endfor %}
    </table>

【问题讨论】:

    标签: django filter relationship


    【解决方案1】:

    请记住,您始终可以使用下划线表示法 ('__') 来跟踪关系

    试试:

    # assuming that request.bbb.aaa.name has the value aaa.name must match
    CCC.objects.filter(bbb__aaa__name=request.bbb.aaa.name)
    

    【讨论】:

    • 在我的例子中 AAA = Stage,BBB = SubStage,CCC = ZoneSubStage,当我按照你的建议时,我得到错误“'function' object has no attribute 'substage'”
    • @BlueTomato 那个错误不是因为查询。请提供有关您的模型的更多信息。
    • @BlueTomato 你测试过request.substage.stage.slug 的值吗?可以打印吗?
    • @BlueTomato 你在那里,查询没有错,你没有得到slug 值。它来自哪里?
    • 在 UpdateView 中查看你的 kwargs
    猜你喜欢
    • 2013-07-20
    • 2018-08-28
    • 2012-11-18
    • 2019-10-26
    • 2020-10-08
    • 2021-01-04
    • 1970-01-01
    • 2021-07-02
    • 2020-09-07
    相关资源
    最近更新 更多