Django在没有外键的情况下查询多个表

时间:2015-10-09 05:23:34

标签: python mysql django

我的模特看起来像这样

class Trans(models.Model):
    id = models.CharField(primary_key=True, max_length=60)
    sys = models.ManyToManyField(Sys)
    flag = models.CharField(max_length=15, blank=True, null=True)

class Sys(models.Model):
    id = models.CharField(primary_key=True, max_length=64)
    mid = models.CharField(max_length=15, blank=True, null=True)
    numbers = models.IntegerField(blank=True, null=True)
    org = models.CharField(max_length=100, blank=True, null=True)

我希望在Trans中途获得 org 数字并在这样的模板中使用它们

{% for row in rowlist %}
    {{ row.mid }}  //in Trans
    {{ row.flag }}  //in Trans
    {{ row.org }}  //in Sys when mid=Trans.mid
    {{ row.numbers }}//in Sys when mid=Trans.mid

SQL shoule be

SELECT Sys.numbers, Sys.org FROM Sys, Trans WHERE Trans.mid = Sys.mid

如何在Django中进行这样的查询? 我试过了

cursor.execute("SELECT * From trans, sys")
rowlist = cursor.fetchone()

返回我需要的但是turple

3 个答案:

答案 0 :(得分:0)

我不知道你为什么这样做,但是,
我认为这可以解决您的问题:

mid_list = Trans.objects.values_list('mid', flat=True)
rowlist = Sys.objects.filter(mid__in=mid_list)

编辑1

class Trans(models.Model):
    id = models.CharField(primary_key=True, max_length=60)
    sys = models.ManyToManyField(Sys, through='TranSys')
    flag = models.CharField(max_length=15, blank=True, null=True)

class Sys(models.Model):
    id = models.CharField(primary_key=True, max_length=64)
    mid = models.CharField(max_length=15, blank=True, null=True)
    numbers = models.IntegerField(blank=True, null=True)
    org = models.CharField(max_length=100, blank=True, null=True)

class TranSys(models.Model):
    trans = models.Foreingkey(Trans)
    sys = models.ForeignKey(Sys)

现在,只需使用:

rowlist = TranSys.objects.values('sys__org', 'sys__numbers','sys__mid','trans__flag')

答案 1 :(得分:0)

我建议将其设为外键,因为它应该是。

你可以这样做。

trans_mid = Trans.objects.values('mid')
syss = Sys.objects.filter(mid__in=trans_mid)

此外,您可以使用raw_sql执行此类查询。

答案 2 :(得分:0)

如果你在ForeignKey课程中作为Sys中等,那就更好了。 所以你可以直接访问;

sys_list = Sys.objects.filter(
    mid__in=Trans.objects.values('mid')
).values('numbers', 'org')