Внешние запросы Django

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

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

Также, пожалуйста, предложите хорошую ссылку для запросов.

Ответ 1

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

options.objects.filter(header=a_header)

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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