Ошибка Django OneToOne - PullRequest
0 голосов
/ 07 июня 2018

Предположим, класс:

class M(models.Model):
      rel = models.OneToOneField(X,on_delete=models.CASCADE)

Теперь, если я хочу получить доступ к экземпляру M через экземпляр x XI, напишу:

x=X.objects.all().first()
x.m

Однако, когда не существуетэкземпляр M, связанный с x, выдает ошибку.Как заставить его вернуть None вместо ошибки.

Редактировать: Это связано с OneToOneField, а не с фильтрацией вообще

Ответы [ 3 ]

0 голосов
/ 07 июня 2018

В дополнение к ответу @WillemVanOnsem, вы можете использовать в качестве опции getattr встроенную функцию вместо try / исключением:

getattr(x, 'm', None)
0 голосов
/ 29 марта 2019

Вы всегда можете использовать

hasattr(model_instance,attribute)

, который вернет false, если нет атрибута, или true, если есть атрибут

. В вашем случае вы можете проверить, что

hasattr(x,m) 

будетвернуть true, если есть m для данного X, и false в противном случае

0 голосов
/ 07 июня 2018

Несколько человек просили об этом.Смотрите, например, билет # 10227 .Но у меня есть идея, что это не изменится (очень) скоро (если вообще).Было написано много кода с предположением, что если нет обратного объекта, возникнет ошибка, и простое изменение этого поведения может привести к поломке нескольких частей Django, плагинов, веб-серверов и т. Д.

В результатеЯ думаю, что, вероятно, лучше " научиться жить с этим " (по крайней мере, пока).Тем не менее, есть кое-что, что мы можем сделать, чтобы немного облегчить боль, используя " protected " related_name:

class M(models.Model):
      rel = models.OneToOneField(X<b>, related_name='_m'</b>, on_delete=models.CASCADE)

Затем мы можем добавить @property к модели X:

class X(models.Model):

    <b>@property
    def m(self):
        try:
            return self._m
        except M.DoesNotExists:
            return None</b>

Мы можем использовать этот подход, если мы определили модель X самостоятельно, или мы можем использовать исправление обезьяны , чтобы добавитьтакие свойства для классов, которые были определены в библиотеке и т. д.

Так что теперь мы можем (безопасно) использовать some_x.m.Но, тем не менее, это не решит все наши проблемы, так как, например, для фильтрации и т. Д. Выше не будет работать.

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