python - Django过滤查询集返回外键值
问题描述
这里又是一个 Django 问题。我有以下模型:
class Host(models.Model):
id = models.IntegerField(primary_key=True)
hostname = models.TextField()
class Meta:
managed = False
db_table = 'py_hosts'
class Ip(models.Model):
id = models.IntegerField(primary_key=True)
ip = models.TextField()
class Meta:
managed = False
db_table = 'py_ip'
class Port(models.Model):
id = models.IntegerField(primary_key=True)
port = models.TextField()
class Meta:
managed = False
db_table = 'py_ports'
class Service(models.Model):
id = models.IntegerField(primary_key=True)
host = models.ManyToManyField("Host", through="HostService")
ip = models.ManyToManyField("Ip", through="HostService")
port = models.ManyToManyField("Port", through="HostService")
service = models.TextField()
class Meta:
managed = False
db_table = 'py_services'
def __str__(self):
return self.service
class HostService(models.Model):
id = models.IntegerField(primary_key=True)
host = models.ForeignKey(Host, on_delete=models.DO_NOTHING)
ip = models.ForeignKey(Ip, on_delete=models.DO_NOTHING)
port = models.ForeignKey(Port, on_delete=models.DO_NOTHING)
service = models.ForeignKey(Service, on_delete=models.DO_NOTHING)
class Meta:
managed = False
db_table = 'py_hostservices'
我还使用 django-filters 在 filters.py 中声明了过滤器:
class ServiceFilter(django_filters.FilterSet):
class Meta:
model = Service
fields = {
'host': ['icontains',],
'ip': ['icontains',],
'service': ['icontains',],
'port': ['icontains',],
}
在视图中调用过滤器:
class ServiceListView(ListView):
model = Service
template_name = 'services/service_list.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['filter'] = ServiceFilter(self.request.GET, queryset=self.get_queryset())
return context
最后是调用过滤器的html文件:
<div class="container">
<form method="GET">
{{ filter.form }}
<button type="submit" class="default" name="_save">Search</button>
</form>
<table border="1">
<tbody>
{% for service in filter.qs %}
<tr>
<td>{{ service.host }}</td>
<td>{{ service.ip }}</td>
<td>{{ service.service }}</td>
<td>{{ service.port }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
显然代码不起作用,但我不明白我应该如何使用 Django ORM 或过滤器来根据外键值过滤查询集并显示外键值,因为临时表仅用于链接外键。
我想要获得的是一个查询集,它输出与以下 SQL 等效的内容:
SELECT a.description, b.description, c.description, d.description
FROM py_hostservices
JOIN py_services ON py_services.id = py_hostservices.service_id
JOIN py_ports ON py_ports.id = py_hostservices.port_id
JOIN py_ip ON py_ip.id = py_hostservices.ip_id
JOIN py_hosts ON py_hosts.id = py_hostservices.host_id
您能否就我如何在 Django 中开发它提供一些见解?
更新:新版本的模型、过滤器、视图和 html。
解决方案
好的,有时更简单更好。由于我基于数据库视图,我通过在数据库中完全创建最终视图解决了设计问题,然后创建了一个模型:
class HostService(models.Model):
id = models.IntegerField(primary_key=True)
hostname = models.TextField()
ip = models.TextField()
port = models.TextField()
servicename = models.TextField()
class Meta:
managed = False
db_table = 'py_hostservices'
推荐阅读
- javascript - 通过书签设置文档标题,如何?
- android - 使用 Android 的资源覆盖机制覆盖布局文件时,findViewById 返回 null
- python - 将 csv 文件读取到字典 - 仅读取第一个键 + 值
- async-await - NextJS API 路由在收到数据之前返回?
- python - Dask-Kmeans 大尺寸数组的错误
- android - 即使我们解决了这个问题,我的应用更新也被多次拒绝
- html - 带有网格布局的边框和中心图标
- flutter - 颤振不被识别为内部和外部命令
- java - webview如何根据y值设置滚动范围?
- amazon-web-services - 从 DocumentDB 到 S3 的跨账户 DMS 复制