Чтение внешнего ключа ref в save () приводит к переопределению RelatedObjectDoesNotExist - PullRequest
0 голосов
/ 10 мая 2018

Я предполагаю, что это сделано специально, но вот мой сценарий: если я сохраняю Child без родителя, я хочу создать нового Parent.

class Parent(models.Model):
    pass

class Child(models.Model):
    parent = models.ForeignKey(Parent, on_delete=models.PROTECT, related_name='children')

    def save(self, *args, **kwargs):
        if self.parent is None: # error happens here
            self.parent = Parent.objects.create()
        super().save(*args, **kwargs)

c = Child()
c.save()
# django.db.models.fields.related_descriptors.RelatedObjectDoesNotExist: Child has no parent.

Я получаю вышеупомянутый RelatedObjectDoesNotExist при выполнении if self.parent is None,Я также пробовал if not self.parent, та же ошибка в той же строке.Я не хочу, чтобы родительское поле обнулялось.Достаточно просто чтения self.parent, даже чтобы проверить, нет ли его, достаточно, чтобы вызвать ошибку.

Это в Django 1.11, здесь возникает ошибка: https://github.com/django/django/blob/2b882a4bd954c8a6b1447f8fc0841a3352514c26/django/db/models/fields/related_descriptors.py#L193,, так что еслиЯ читаю это правильно, просто читая self.parent, я в конечном итоге в этом __get__.

Как я могу "дать ему значение, если его нет", если я не могу проверитьчто это None?

1 Ответ

0 голосов
/ 10 мая 2018

Проблема в том, что доступ к самому FK вызывает поиск в базе данных, который завершается ошибкой.Чтобы избежать этого, получите доступ к соответствующему полю ID:

if self.parent_id is None:
...