Django:连接两个表
以下是我目前拥有的:Django:连接两个表,django,django-models,Django,Django Models,以下是我目前拥有的: class Sessions(models.Model): sessionId = models.AutoField(primary_key=True) class Ip(models.Model): ipId = models.AutoField(primary_key=True) class Affiliation(models.Model): affiliationId = models.AutoField(primary_key=True
class Sessions(models.Model):
sessionId = models.AutoField(primary_key=True)
class Ip(models.Model):
ipId = models.AutoField(primary_key=True)
class Affiliation(models.Model):
affiliationId = models.AutoField(primary_key=True)
ip = models.ForeignKey("Ip", null=False, db_column="ipId")
session = models.ForeignKey("Sessions", null=False, db_column="sessionId")
现在我想找到Sessions QuerySet,它返回ipId=x。基本上这就是我正在尝试的:
Sessions.objects.filter(affiliation__ip=x)
在django中有什么方法可以做到这一点吗?重构代码
抱歉,请容忍我并从中吸取教训
您不必在Django中显式指定id。除非您的类是非托管的。Django会自动使用id
或pk
来引用它
模型命名通常为单数会话
请注意冲突模型名称,Session
已由DjangoDjango.contrib.sessions.models.Session内部使用。使用诸如ClientSession
之类的替代名称会更好
使用ManyToManyField
(可选),它只是简化查询集的助手
使用GenericPaddressField
你没有附加属性,因此你可以考虑删除它。
最终模型
答复
查询会话与当前模型非常直接
找到了答案
psobjs = Affiliation.objects.filter(ipId=x)
queryset = Sessions.objects.filter(sessionId__in=psobjs.values('sessionId'))
我认为如果你在从属关系模型中使用一个相关的_名称,如下所示:
class Sessions(models.Model):
sessionId = models.AutoField(primary_key=True)
class Ip(models.Model):
ipId = models.AutoField(primary_key=True)
class Affiliation(models.Model):
affiliationId = models.AutoField(primary_key=True)
ip = models.ForeignKey("Ip", null=False, db_column="ipId")
session = models.ForeignKey(
"Sessions", null=False,
db_column="sessionId",
related_name="affiliation_session"
)
现在,您可以筛选:
Sessions.objects.filter(affiliation_session__ip_id=X)
如有必要,您可以使用select_related进行优化我想显示一个报告,其中我想从Details表中选择customer_name、mobile_no和status表中选择status。你可以看到我的模型
class Details(models.Model):
customer_name = models.CharField(max_length=100,unique=True)
mobile_no = models.IntegerField()
class Status(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
status = models.CharField(max_length=25)
purchase = models.ForeignKey(Details, null=True, on_delete=models.SET_NULL)
解决方案
步骤1:将以下代码添加到视图中。[views.py]
def customer_report(request):
status_obj = Status.objects.all()
return render('reports/customer_report.html', {'status_obj':status_obj})
步骤2:在模板端添加以下代码[report.html]
<table class="table">
<thead>
<tr>
<th>Name</th>
<th>Mobile No</th>
<th>Status</th>
</tr>
</thead>
<tbody>
{% for data in status_obj %}
<tr>
<td>{{data.purchase.customer_name}}</td>
<td>{{data.purchase.mobile_no}}</td>
<td>{{data.status}}</td>
</tr>
{% endfor %}
</tbody>
</table>
名称
手机号码
地位
{%用于状态为_obj%}
{{data.purchase.customer_name}
{{data.purchase.mobile{u no}
{{data.status}
{%endfor%}
这是会话和IP之间的多对多关系。您是否尝试了Affiliation.objects.filter(IP\uu ipId=x)。选择\u related()
因为附属关系的每一行在会话中都有一个唯一的行,所以您有多个会话对象,可以通过附属关系访问。在filteringI之后创建的会话
对象没有直接回答您的问题,但我正试图帮助您找到更好的替代方案。如果您有任何问题,在重构部分,欢迎评论谢谢你的评论,我很感激。除了我要记住的命名之外,还有一个原因我没有使用manytomy。“Session”类可以与IP或类似于User的东西相关联。如果我使用manytomany,每当用户未登录时,我都会看到很多空值。我想避免这种情况,因此建立了从属关系表。
class ClientSession(models.Model):
client_source = models.ManyToManyField('IP')
class IP(models.Model):
address = models.GenericIPAddressField()
x = 1 # Some ID
ClientSession.objects.filter(ips__id=x)
psobjs = Affiliation.objects.filter(ipId=x)
queryset = Sessions.objects.filter(sessionId__in=psobjs.values('sessionId'))
class Sessions(models.Model):
sessionId = models.AutoField(primary_key=True)
class Ip(models.Model):
ipId = models.AutoField(primary_key=True)
class Affiliation(models.Model):
affiliationId = models.AutoField(primary_key=True)
ip = models.ForeignKey("Ip", null=False, db_column="ipId")
session = models.ForeignKey(
"Sessions", null=False,
db_column="sessionId",
related_name="affiliation_session"
)
Sessions.objects.filter(affiliation_session__ip_id=X)
class Details(models.Model):
customer_name = models.CharField(max_length=100,unique=True)
mobile_no = models.IntegerField()
class Status(models.Model):
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
status = models.CharField(max_length=25)
purchase = models.ForeignKey(Details, null=True, on_delete=models.SET_NULL)
def customer_report(request):
status_obj = Status.objects.all()
return render('reports/customer_report.html', {'status_obj':status_obj})
<table class="table">
<thead>
<tr>
<th>Name</th>
<th>Mobile No</th>
<th>Status</th>
</tr>
</thead>
<tbody>
{% for data in status_obj %}
<tr>
<td>{{data.purchase.customer_name}}</td>
<td>{{data.purchase.mobile_no}}</td>
<td>{{data.status}}</td>
</tr>
{% endfor %}
</tbody>
</table>