2014-12-16 3 views
1

Мне нужно выбрать подмножество внешнего ключа, но ограничивать его только подмножеством. Это необработанный запрос, который использовался в старой базе данных PHP;Django, подмножество внешнего ключа

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 

Все таблицы, характер, черта, traittype и character_trait доступны, но я не могу понять, как сделать это в Djando. Моя идея была такова;

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

Но это просто дает ошибку «ключевое слово не может быть выражением». Я могу сделать это очень уродливо и просто перебирать полученные «черты», используя цикл for, подобный этому;

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 
+0

Вы могли бы опубликовать свои определения моделей? django filter keywoards используют '__' 2 под значениями для привязки fk – dm03514

+0

Готово, добавлены модули. – Eloque

ответ

0

Я собирался предложить вам необходимо приковать фильтры, как

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

+0

Это сработало. Потрясающие. Спасибо. – Eloque

0

Вы должны прочитать документы на lookups that span relationships. Вам нужно использовать синтаксис с двойным подчеркиванием:

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

Это хороший указатель, я собираюсь прочитать об этом. – Eloque

Смежные вопросы