Python django使用外键连接
我是django 2.7的新手。我正在尝试使用外键约束运行联接查询。我有两个表table1和table2,它们具有以下属性-: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
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')