Django:加入两个表

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做到这一点吗?

Yeo*_*Yeo 6

重构你的代码

道歉,请忍受我并从中学习.

您不必在Django中明确指定id.除非你的班级没有管理.Django自动使用idpk引用它.

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)


aze*_*h38 6

找到答案了!

psobjs = Affiliation.objects.filter(ipId=x)
queryset = Sessions.objects.filter(sessionId__in=psobjs.values('sessionId'))
Run Code Online (Sandbox Code Playgroud)