Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:连接两个表_Django_Django Models - Fatal编程技术网

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
已由Django
Django.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>