Как получить значение поля ForeignKey при создании новой модели? - PullRequest
0 голосов
/ 02 июня 2019

Я ищу наиболее эффективный способ реализации такого механизма в модели Django. Давайте предположим ситуацию, когда есть 2 очень простые модели:

class FKModel(models.Model):
    value = BooleanField()

class AModel(models.Model):
    fk = models.ForeignKey(FKModel)
    a_value = models.CharField(max_length=150)

    def clean(self, *args, **kwargs):
        # the line below is incorrect
        if not self.fk.value:    # <--- how to do this in a proper way?
            raise ValidationError('FKModel value is False')
        super(AModel, self).clean(*args, **kwargs)

    def save(self, *args, **kwargs):
        self.full_clean()
        super(AModel, self).save(*args, **kwargs)

Я знаю, что могу сделать что-то вроде FKModel.objects.all()/.get(), но я не думаю, что это лучшее решение (поскольку требует дополнительных запросов к базе данных).

1 Ответ

0 голосов
/ 02 июня 2019

Я не уверен, что вы пытаетесь сделать в вашем методе clean(), но я предполагаю, что вы пытаетесь ограничить ненулевое условие для внешнего ключа.Все поля не ограничены пустыми значениями по умолчанию, и вы должны установить null=False и blank=False, если хотите, чтобы поле принимало пустые значения:

class AModel(models.Model):
    fk = models.ForeignKey(FKModel, null=True, blank=True)
    a_value = models.CharField(max_length=150)

Если вы хотите ограничить ненулевое условие длявручную, вы должны сделать это следующим образом:

class FKModel(models.Model):
    value = BooleanField()

class AModel(models.Model):
    fk = models.ForeignKey(FKModel)
    a_value = models.CharField(max_length=150)

    def clean(self, *args, **kwargs):
        # the line below is correct
        if self.fk is None:    # <--- this is the proper way?
            raise ValidationError('FKModel value is False')
        super(AModel, self).clean(*args, **kwargs)

    def save(self, *args, **kwargs):
        self.full_clean()
        super(AModel, self).save(*args, **kwargs)

Для извлечения записей базы данных и связанных с ней записей вы используете prefetch_related , и вы получаете свою запись и связанные с ней записи в одномпопадание в одну базу данных:

AModel.objects.all().prefetch_related('fk')
...