Запросы внешнего ключа Django - PullRequest
10 голосов
/ 27 марта 2010

В следующей модели:

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

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

Ответы [ 4 ]

20 голосов
/ 27 марта 2010

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

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

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

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

С точки зрения ссылок документация Django превосходна и объясняет все это.

9 голосов
/ 27 марта 2010

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

options.objects.filter(header=a_header)

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

5 голосов
/ 27 марта 2010

Похоже, что вы ищете Следующие отношения "назад" .

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

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

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

4 голосов
/ 27 марта 2010

Я бы предложил попробовать стиль кодирования и соглашение об именах, которое больше похоже на документацию 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)

Документация по отношениям "многие к одному" также ссылается на пример использования .

...