@Nposk

Как получить доступ к полям связанного объекта через 2 таблицы в Django?

Есть база данных из 4 моделей (таблиц), связанных между собой каскадом через ForeingKey.
Как получить из 1 модели к полям 4 и наоборот?
  • Вопрос задан
  • 2880 просмотров
Пригласить эксперта
Ответы на вопрос 2
Mi11er
@Mi11er
A human...
Как то так .. в обратку так же работает =)

class ModelBase(models.Model):
    title = models.CharField(_("Название"), max_length=250, blank=False)

    def __str__(self):
        return self.title


class Model(ModelBase):
    some = models.CharField(_("Что то "), max_length=250)

class Model1(ModelBase):
    some = models.CharField(_("Что то "), max_length=250)
    m = models.ForeignKey(Model, on_delete=models.CASCADE)

class Model2(ModelBase):
    some = models.CharField(_("Что то "), max_length=250)
    m1 = models.ForeignKey(Model1, on_delete=models.CASCADE)

class Model3(ModelBase):
    some = models.CharField(_("Что то "), max_length=250)
    m2 = models.ForeignKey(Model2, on_delete=models.CASCADE)


from core.models import *
m1 = Model.objects.all()
m1[0].model1_set
<django.db.models.fields.related_descriptors.create_reverse_many_to_one_manager.<locals>.RelatedManager object at 0x00000296EFFAAE20>

m1[0].model1_set.all()[0].model2_set.all()[0].model3_set.all()[0].some
'some m3'
Ответ написан
Представим 2 модели Post и Category. В модели Post поле со свзяью(назовем это поле cat) foreignkey с Category(т.е Post-вторичная модель, Category - первичная). Если мы хотим через модель Post обратиться к Category: Post.objects.filter(cat__id=1). Тут был пример фильтрации постов, у которых категория с id=1. То есть мы ищем посты у которых категория самая первая (по id).Если мы хотим обраться через Category к модели Post (обратная связь), то тут надо использовать менеджер обратной связи ( [имя вторичной модели]_set или использовать свойство related_name, если оно определено у поля cat ). К примеру:
cat = Category.objects.get(id=1) - получение категории с  id=1

И теперь через менеджер обратной свзязи ( в нашем случае, если related_name не указан - будет post_set, если же related_name указан используем его). cat.post_set.all() - выводим все посты принадлежащие cat, категории с id =1. Надеюсь я то, что нужно обьяснил?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы