Внешние запросы 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)
Документация для отношения "многие-к-одному" также ссылается на пример использования.