Джанго - Получить модель внешнего ключа - PullRequest
24 голосов
/ 02 октября 2011

Как я могу получить тип модели внешнего ключа?

Например:

class Category(models.Model):
    name = models.CharField(max_length = 100)

class SubCategory(models.Model):
    category = models.ForeignKey(Category)
    title = models.CharField(max_length = 100)

Я хочу получить модель категории в подкатегории.

Как мне сделатьЭто?

Ответы [ 4 ]

25 голосов
/ 02 октября 2011

Попробуйте:

subcategory = SubCategory.objects.get(pk=given_pk)
subcategory.category

РЕДАКТИРОВАТЬ:

subcategory._meta.get_field('category').rel.to
11 голосов
/ 02 октября 2011

ForeignKeys - это ReverseSingleRelatedObjectDescriptor объекты. Так вот с чем ты действительно работаешь. Вы получите это, если вы запустите type(SubCategory.category). Отсюда вы можете использовать два способа получить фактический класс / модель, на которую вы ссылаетесь.

SubCategory.category.field.rel.to  # <class 'path.to.Model'>
SubCategory.category.field.rel.to.__name__  # 'Category'

# or these will do the same thing

SubCategory._meta.get_field('category').rel.to
SubCategory._meta.get_field('category').rel.to.__name__

Если вы не знаете имя атрибута до времени выполнения, используйте getattr(SubCategory, attributeNameVariable), чтобы получить объект ReverseSingleRelatedObjectDescriptor для этого поля ForeignKey.

7 голосов
/ 14 июня 2018

Для Джанго> = 2,0

>>> SubCategory._meta.get_field('category').remote_field.model
>>> 'my_app.models.Category'

Чтобы получить название модели, используйте свойство класса __name__.

>>> SubCategory._meta.get_field('category').remote_field.model.__name__ 
>>> 'Category'
0 голосов
/ 05 марта 2019

также для django> = 2.0

>>> SubCategory._meta.get_field('category').related_model
>>> <class 'my_app.models.Category'>
>>> SubCategory._meta.get_field('category').related_model._meta.model_name
>>> 'category'
...