Как получить доступ к родительской модели из одного из моих полей fk? - PullRequest
1 голос
/ 05 июля 2019

Я пытаюсь получить доступ к родительскому экземпляру от его дочернего элемента.

У меня есть следующие модели

class ModelA(models.Model):
   user_name = models.Charfield()
   points = models.Charfield()

class ModelB(models.Model):
   user = models.ForeignKey(ModelA)
   points = models.Charfield()

class ModelC(models.Model):
   model_b = models.OneToOne(ModelB)
   info = models.TextField()

И я делаю запрос, подобный этому:

ModelB.objects.filter({somefilters}).values('user__user_name')

Но я хочу проверить, есть ли ссылка наB в C, и если есть, получить информацию.Я не могу начать с ModelC как:

ModelC.objects.filter({somefilers}).values('model_b__user__user_name')

Потому что может быть или нет запись, касающаяся обеих моделей.

Возможно ли начать с ModelB, чтобы получить информацию от своего родительского ModelC?

Ответы [ 2 ]

1 голос
/ 05 июля 2019

Вы можете использовать связанное имя в модели C, например:

class ModelC(models.Model):
   model_b = models.OneToOne(ModelB, related_name='modelc')
   info = models.TextField()

А в вашем наборе запросов:

ModelB.objects.filter({somefilters}).values('user__user_name', 'modelc__info')

Если вы не хотите устанавливать связанное имя, вы можете использовать: model_b_set__info вместо modelc__info

1 голос
/ 05 июля 2019

Да, вы можете воспользоваться поиском __isnull [Django-doc] здесь:

ModelB.objects.filter(
    <b>modelc__isnull=False</b>
).values('user__user_name')

Здесь мы, таким образом, проверяем, есть лиModelC, который указывает на этот ModelB объект.

Вы также можете получить доступ к связанному объекту modelc, например, в ваших значениях, например:

ModelB.objects.filter(
    modelc__isnull=False
).values('user__user_name', <b>'modelc__info'</b>)

Это будеттаким образом, мы получим JOIN, где мы JOIN поле ModelC.model_b в ModelB.pk.

Если вы используете:

ModelB.objects.values('user__user_name', <b>'modelc__info'</b>)

Он вернет None для modelc__info дано нет такое отношение ModelC существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...