带有两个外键的Django查询

时间:2019-03-27 08:54:52

标签: django django-models foreign-keys

我正在尝试创建一个应用程序页面。在此页面上,显示应用程序名称。现在,我想显示DRP应用程序(如果存在)。

urls.py:

path('application/<int:application_id>/', views.application, name='application')

模型是这样的:

class Application(models.Model):
    application_name = models.CharField(max_length=64)

    def __str__(self):
        return self.application_name


class Drp_Application(models.Model):
    application_prod = models.OneToOneField(Application, related_name='drp_application_prod', on_delete=models.CASCADE)
    application_drp = models.OneToOneField(Application, related_name='drp_application_drp', on_delete=models.CASCADE)

    def __str__(self):
        return str(self.application_prod) + " -> " + str(self.application_drp)

Drp_Application模型包含生产应用程序和DRP应用程序之间的链接。

我当前的工作页面是这样的:

def application(request, application_id):
    application = get_object_or_404(Application, pk=application_id)
    # application_drp = ...
    context = {
        'application': application,
        'application_drp': application_drp
    }
    return render(request, 'application.html', context)

在页面application_id的视图下,如何请求从application获取DRP应用程序模型?

感谢您的帮助

编辑

我已经找到了一种方法,但是可能不是很好。

application_drp_id = Drp_Application.objects.get(application_prod=application_id)
application_drp = Application.objects.filter(application_name=application_drp_id.application_drp)

可能在一个请求中?

1 个答案:

答案 0 :(得分:2)

更新的答案

ApplicationDrp_Application之间的关系为OneToOne时,应采用以下方法:

application.drp_application_prod.application_drp

旧答案

您可以简单地这样做(基于reverse relation)(当其外键关系时):

views.py中(如果需要)

application.drp_application_prod.all() # to get production apps
application.drp_application_drp.all() # to get drp apps

在模板中:

{{ application.drp_application_prod.all }}
{{ application.drp_application_drp.all }}  

// Or just iterate through the list

{% for drp in application.drp_application_prod.all %}
     {{ drp }}
{% endfor %}

更新

for drp in application.drp_application_prod.all():
    print(drp.application_drp)

# Or

application.drp_application_prod.values_list('application_drp')  # list queryset