Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.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
Python Django,外键的子集_Python_Mysql_Django - Fatal编程技术网

Python Django,外键的子集

Python Django,外键的子集,python,mysql,django,Python,Mysql,Django,我需要一种方法来选择外键的一个子集,但只限于一个子集。这是旧PHP数据库中使用的原始查询 SELECT a.name FROM character_trait b LEFT JOIN trait a ON b.id_trait = a.id WHERE b.id_character = 1 AND a.id_traittype = 10 所有的表格,character,trait,traittype和character_trait都是可用的,但是我不知道如何在Djando中实现它。我的想法是这

我需要一种方法来选择外键的一个子集,但只限于一个子集。这是旧PHP数据库中使用的原始查询

SELECT a.name FROM character_trait b
LEFT JOIN trait a ON b.id_trait = a.id
WHERE b.id_character = 1
AND a.id_traittype = 10
所有的表格,character,trait,traittype和character_trait都是可用的,但是我不知道如何在Djando中实现它。我的想法是这样的

traits = CharacterTrait.objects.filter( id_character = character, id_trait.id_traittype = 10 )
但这只是给出了一个错误,关键字不能是表达式。我可以用一种非常难看的方式来做,只需使用这样的for循环来迭代得到的“traits”

traits = CharacterTrait.objects.filter( id_character = character )  

for t in traits:
    print t.id_trait.id_traittype.id

    if t.id_trait.id_traittype.id == 10:
        print "Got One"
编辑模块定义

class Trait(models.Model):
    id = models.IntegerField(primary_key=True)  # AutoField? 
    id_traittype = models.ForeignKey(Traittype, null=True, db_column = 'id_traittype')

    name = models.CharField(max_length=32)

    class Meta:
        managed = False
        db_table = 'trait'

    def __unicode__(self):
                return self.name

class Traittype(models.Model):
    id = models.IntegerField(primary_key=True)  # AutoField?
    name = models.CharField(max_length=64)

    class Meta:
        managed = False
        db_table = 'traittype'

    def __unicode__(self):
                return self.name    

class Trait(models.Model):
    id = models.IntegerField(primary_key=True)  # AutoField? 
    id_traittype = models.ForeignKey(Traittype, null=True, db_column = 'id_traittype')

    name = models.CharField(max_length=32)

    class Meta:
        managed = False
        db_table = 'trait'

    def __unicode__(self):
                return self.name

class CharacterTrait(models.Model):
    id = models.IntegerField(primary_key=True)  # AutoField?
    ##id_character = models.IntegerField()
    ## id_trait = models.IntegerField()
    id_character = models.ForeignKey(Werewolfcharacter, null=True, db_column = 'id_character')
    id_trait     = models.ForeignKey(Trait,             null=True, db_column = 'id_trait')

    class Meta:
        managed = False
        db_table = 'character_trait'

    def __unicode__(self):
                return self.id_trait.name  

一个简单的可能性,因为您的PHP代码中可能已经有了正确的SQL,就是简单地执行

traits = CharacterTrait.objects.filter( id_character = character).filter(id_trait__id_traittype = 10 )
但回顾一些代码

traits = CharacterTrait.objects.filter( id_character = character, id_trait__id_traittype = 10 )

应该足够了,这里的关键是更换。使用dm03514建议的_uu

时,您应该阅读上的文档。您需要使用双下划线语法:

CharacterTrait.objects.filter(id_character=character, id_trait__id_traittype=10)

你能发布你的模型定义吗?django filter键盘使用分数下的_u2来跨越fk relationshipsDone,增加了模块。