2010-03-27 1 views
10

В следующей модели:ключевых Джанго Зарубежных запросов

class header(models.Model): 
    title = models.CharField(max_length = 255) 
    created_by = models.CharField(max_length = 255) 

    def __unicode__(self): 
     return self.id() 

class criteria(models.Model): 
    details = models.CharField(max_length = 255) 
    headerid = models.ForeignKey(header) 

    def __unicode__(self): 
     return self.id() 

class options(models.Model): 
    opt_details = models.CharField(max_length = 255) 
    headerid = models.ForeignKey(header) 

    def __unicode__(self): 
     return self.id() 

Если есть строка в базе данных для заголовка таблицы, как Id=1, title=value-mart , createdby=CEO

Как запросить критерии и опционные таблицы, чтобы получить все значения связанные с таблицей заголовков id = 1

Также может быть предложена хорошая ссылка для примеров запросов.

ответ

9

Прежде всего, не используйте id в именах, потому что это сбивает с толку. Это поле не является идентификатором, это сам объект. (Если у вас есть поле ref он автоматически создает поле ref_id)

options.objects.filter(header=a_header) 

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

3

Я бы предложил попробовать coding style и соглашение об именовании, которое больше похоже на документацию Django для Models. Что-то больше, как это:

class Header(models.Model): 
    ... 

class Criteria(models.Model): 
    details = model.CharField(max_length=255) 
    header = models.ForeignKey(Header) 

А затем запросить их по мере необходимости:

# find Criteria for a given header 
value_mart = Header.objects.get(id=1) 

# ... via an instance of Header. 
value_mart.criteria_set.all() 

# ... or with a filter(). 
Criteria.objects.filter(header=value_mart) 
Criteria.objects.filter(header_id=1) 

Документация many-to-one relationships также ссылается usage example.

20

Ironfroggy is right, но есть еще один более очевидный способ получить соответствующие объекты options и criteria. Django автоматически создает обратную связь для каждого внешнего ключа, указывающего на модель, и обычно это имя связанной модели плюс _set. Итак:

mycriteria.options_set.all() 
mycriteria.header_set.all() 

даст вам все options и header объекты, связанные с criteriamycriteria объекта.

Кроме того, примечание о стиле: как указано в описании железной дороги, вы не должны использовать id в полях внешнего ключа, но также вы должны использовать стиль «Заглавная» для ваших классов моделей, чтобы вы могли видеть разницу между классом Criteria и конкретный экземпляр criteria.

С точки зрения ссылок, Django documentation является отличным и объясняет все это.

5

похоже, что вы ищете Following relationships "backward".

Вы можете получить объект заголовка, который вы хотите фильтровать, и использовать что-то вроде

obj = Header.objects.get(title="value-mart", "createdby=CEO") 
obj.criteria_set.all() 

Посмотрите на documentation для получения более подробной информации