aze*_*h38 1 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)
ip = models.ForeignKey("Ip", null=False, db_column="ipId")
session = models.ForeignKey("Sessions", null=False, db_column="sessionId")
Run Code Online (Sandbox Code Playgroud)
现在我想找到返回ipId = x的Sessions QuerySet.基本上这就是我正在尝试的:
Sessions.objects.filter(affiliation__ip=x)
Run Code Online (Sandbox Code Playgroud)
有什么办法可以在django做到这一点吗?
道歉,请忍受我并从中学习.
您不必在Django中明确指定id.除非你的班级没有管理.Django自动使用
id或pk引用它.
class Sessions(models.Model):
pass
Run Code Online (Sandbox Code Playgroud)
模型命名通常是单数
Session.
class Session(models.Model):
pass
Run Code Online (Sandbox Code Playgroud)
注意冲突模型名称,
Session已由Django内部使用django.contrib.sessions.models.Session.使用替代名称,例如ClientSession会更好.
class ClientSession(models.Model):
pass
Run Code Online (Sandbox Code Playgroud)
使用
ManyToManyField(可选),它只是简化查询集的助手.
class ClientSession(models.Model):
client_source = models.ManyToManyField('IP', through='Affiliation')
Run Code Online (Sandbox Code Playgroud)
使用GenericIPAddressField
class IP(models.Model):
address = models.GenericIPAddressField()
Run Code Online (Sandbox Code Playgroud)
您在Affiliation中没有其他属性,因此您可以考虑将其删除.
class ClientSession(models.Model):
client_source = models.ManyToManyField('IP')
Run Code Online (Sandbox Code Playgroud)
class ClientSession(models.Model):
client_source = models.ManyToManyField('IP')
class IP(models.Model):
address = models.GenericIPAddressField()
Run Code Online (Sandbox Code Playgroud)
使用当前模型查询会话非常简单.
x = 1 # Some ID
ClientSession.objects.filter(ips__id=x)
Run Code Online (Sandbox Code Playgroud)
找到答案了!
psobjs = Affiliation.objects.filter(ipId=x)
queryset = Sessions.objects.filter(sessionId__in=psobjs.values('sessionId'))
Run Code Online (Sandbox Code Playgroud)