【问题标题】:How to join a table that is not subject to a foreign key constraint to an outer join如何将不受外键约束的表连接到外连接
【发布时间】:2020-05-13 10:13:08
【问题描述】:

我想知道如何使用 Django 将不受外键约束的表连接到外部连接。

from django.db import models


class Member(models.Model):
    name = models.CharField(max_length=50)

    class Meta:
        db_table = 'member'


class GroupMember(models.Models):
    group_id = models.IntegerField()
    member = models.ForeignKey(Member, on_delete=models.CASCADE)

    class Meta:
        db_table = 'group_member'


class Profile(models.Model):
    type = models.IntegerField()
    member = models.ForeignKey(Member, on_delete=models.CASCADE)
    profile = models.CharField(max_length=50)

    class Meta:
        db_table = 'profile'

在这样一个模型中,通过member_id将特定group_id的group_member和特定类型的profile对外组合后,写SQL语句的结果是

select * from group_member left outer join profile on group_member.member_id=profile.member_id and type=1 where group_id=1;

and type=1 where group_id=1;我们想得到我们得到的结果

res = GroupMember.objects.filter(member__groupmember__group_id=1).filter(member__profile__type=1)

通过会员加入,但是

SELECT "group_member"." id", "group_member"." "group_id", "group_member"." member_id" FROM "group_member" INNER JOIN "member" ON ("group_member"." member_id" = "member"." id") INNER JOIN "group_member" T3 ON ("member"." id" = T3. "member_id") INNER JOIN "profile" ON ("member"." id" = "profile"." member_id") WHERE (T3. "group_id" = 1 AND "profile"." type" = 1)

它没有用。

请告诉我如何解决这个问题。 非常感谢。

【问题讨论】:

    标签: sql django django-models


    【解决方案1】:

    我不知道我是否理解正确,但我猜这应该可行:

    GroupMember.objects.filter(group_id=1).extra(where = ['member_id in (SELECT member_id FROM profile where type=1)'])
    

    顺便说一下,如果需要更多信息,可以查看docs about django queryset mechanism。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多