2013-03-29 4 views
0

У меня есть модель, которая включает в себя:Джанго получения объектов, связанных с

class Campaign(models.Model): 
    campaign_name  = models.CharField(max_length=120) 
. 
. 
. 

class Character(models.Model): 
    name   = models.TextField(max_length=50) 
. 
. 
. 
    def __unicode__(self): 
     return u'%s' % (self.name) 

class Rank(models.Model): 
    campaign_id  = models.ForeignKey('Campaign') 
    character_id = models.ManyToManyField(Character) 
    rank   = models.IntegerField(blank=True) 
. 
. 
. 

В моем шаблоне, который показывает все детали кампании я также хочу, чтобы включать символы и их ранг для этой конкретной кампании, я «Пробовал маршрут GenericRelation и обратный обход без везения. Я на django 1.5.1

+1

Совет для будущего использования - установить контрольную панель pep-8, если вы используете eclipse или включите его, если используете Pycharm. В противном случае, прочитайте это, его спасатель! –

+0

Он задыхается от множества специфических вещей, но да, это отлично. –

ответ

3

Из этого видно, что персонажи не связаны с кампанией напрямую, а только через их ранг. Верный?

В этом случае, учитывая кампанией campaign, то все ряды, связанные с кампанией является campaign.rank_set (вы можете изменить имя, указав related_name на ForeignKey ранга к кампании).

Для каждого из рангов, которые вы выбрали так, считая, что вы выполняете цикл над множеством и вызываете отдельные разряды rank, вы можете найти набор символов с rank.character_id и переплетать их так же, как вы делаете со званиями.

Если у вас есть объект-символ и вы хотите найти все связанные с ним ранги, вы можете сделать character.rank_set.

Возможно, вам стоит пересмотреть свою номенклатуру, но я не могу посоветовать вам, как это сделать, не зная больше о том, что именно для rank и почему оно связано с другими моделями, какими оно есть.

Также имейте в виду, что, поскольку это прямо сейчас, персонаж может иметь несколько рангов. Если вы хотите, чтобы символы имели только один ранг, вам нужно удалить поле ManyToMany из ранга и вместо этого поместить поле ForeignKey для ранжирования по символу.

{% for rank in campaign.rank_set %} 
    <p>Characters for {{ rank }}:</p> 
    <ul> 
    {% for character in rank.character_id %} 
     <li>{{ character }}</li> 
    {% endfor %} 
    </ul> 
{% endfor %} 
+0

Не будет ли говорить код громче слов в этом случае :)? –

+0

Хорошо, конечно. Я колебался, потому что думал, что OP, вероятно, захочет переосмыслить именования и отношения, но вот пример с моделью именно так, как есть. –

+0

Ранг - это их позиция в текущей кампании (так что да, они могут иметь несколько рангов в зависимости от кампании, а единственная связь между персонажем и кампанией - через ранг). Это очень помогает, спасибо! –

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