Python django使用外键连接

Python django使用外键连接,python,mysql,django,Python,Mysql,Django,我是django 2.7的新手。我正在尝试使用外键约束运行联接查询。我有两个表table1和table2,它们具有以下属性-: Model.py-: class table1(models.Model): abcid = models.IntegerField(db_column='abcid', primary_key=True) # Field name made lowercase. abcName = models.CharField(db_column='abcNam

我是django 2.7的新手。我正在尝试使用外键约束运行联接查询。我有两个表table1和table2,它们具有以下属性-:

Model.py
-:

class table1(models.Model):
    abcid = models.IntegerField(db_column='abcid', primary_key=True)  # Field name made lowercase.
    abcName = models.CharField(db_column='abcName', max_length=50, blank=True, null=True)  # Field name made lowercase.
    abcyear = models.IntegerField(db_column='abcYear', blank=True, null=True)



class table2(models.Model):
    abcid = models.ForeignKey('table1', models.DO_NOTHING, db_column='abcid')
    xyzname = models.CharField(db_column='xyzName', max_length=150, blank=True, null=True)  # Field name made lowercase.
    xyztype = models.CharField(db_column='xyzType', max_length=150, blank=True, null=True)  # Field name made lowercase.
我想获得其xyzname包含“菠萝”的所有记录。 我需要的列是-
abcid、abcname、abcyear、xyzname

到目前为止,我所尝试的内容如下-:

table1.objects.filter(table2__xyzname__icontains = 'pineapple')

table2.objects.filter(xyzname__icontains= 'pineapple').table1_set.all()
请帮忙。 错误-:


select_related

在Django中,通常的方法是从一个模型返回对象的查询集,而不是从多个模型返回包含字段的对象

objects = table2.objects.filter(xyzname__icontains= 'pineapple')
然后,您可以在对象之间循环,并使用
obj.abcid

for obj in objects:
    print(obj.xyzname, obj.abcid.id, obj.abcid.abcName, obj.abcid.abcyear)
为了加快查询速度,可以使用,以便Django进行内部联接

objects = table2.objects.filter(xyzname__icontains= 'pineapple').select_related('abcid')

这仍然返回table2对象的查询集。您可以循环使用它们,并以与上面相同的方式访问外键。

我尝试了此操作,但出现了一个错误-“abcid”不能解析为支持预取相同错误的项目,那么“Table2”呢?它可以是任何内容,也可以是我必须按原样编写的内容。抱歉,我删除了我编辑的内容,我犯了一个错误。我编辑了我的答案。请尝试
select\u related
。获取select\u related中给出的错误非关系字段:“ptcid”。选项包括:(无)您确定键入的字段名正确吗?这就像
abcid\uu字段1
abcid\uu字段2
中的
select\u related
abcid
表2中的
外键
名称。建议对模型使用大写名称,例如
表1
表2
。这将使其他Django用户更容易理解您的问题。下次请注意:)实际上,它为引用主表的id而不是abcid(即abcid.id)提供了错误。我遇到的问题与无法使用外键引用引用主字段的问题相同。因为表1的主键是
abcid
,它应该是
obj.abcid.abcid
。另一个选项是使用
obj.abcid\u id
。我已经使用inspectdb重新创建了模型,现在它给了我一个异常-:当我试图执行-:table2.objects.get(pk=207)时,未知列“field list”中的“table2.id”。你对此有什么想法吗?要理解错误,你需要显示完整的回溯和更新的模型。我已经更新了完整的回溯,模型没有任何更改。请查看你是否可以提供帮助。
for obj in objects:
    print(obj.xyzname, obj.abcid.id, obj.abcid.abcName, obj.abcid.abcyear)
objects = table2.objects.filter(xyzname__icontains= 'pineapple').select_related('abcid')