Модель Django max_length от другой модели Django - PullRequest
0 голосов
/ 07 июня 2019

У меня две модели.Модель Copy должна получить max_length из модели AdSpot, не наследуя ее.И после нескольких попыток мне не удалось сделать эту работу:

class AdSpot(models.Model):

    title_max_chars = models.IntegerField(default=0)

    @property
    def title_max_chars_from_adspot(self):
        return self.title_max_chars
class Copy(models.Model):
    adspot = models.ForeignKey(AdSpot, on_delete=models.PROTECT)
    def title_max_chars_from_adspot(self, *args, **kwargs):
        return self.adspot.title_max_chars_from_adspot
    title = models.CharField('Name', max_length=title_max_chars_from_adspot, default="")

Ошибка

polls.Copy.title: (fields.E121) 'max_length' must be a positive integer.

Чего мне не хватает?

Ответы [ 3 ]

1 голос
/ 07 июня 2019

Вы делаете вещи неправильно. max_length должно быть целым числом, и вы передаете python FunctionType объект. title_max_chars_from_adspot - это метод экземпляра класса Copy и у вас нет экземпляра класса Copy (вы никогда не получите его во время makemigration/migration) процесса. Единственный способ - передать int max_length=5, например, или записать @staticmethod @classmethod для Copy класса (но в этом случае будет невозможно получить доступ к ForeignKey объекту). Изменить стратегию.

class AdSpot(models.Model):

    title_max_chars = models.IntegerField(default=22)

class Copy(models.Model):
    adspot = models.ForeignKey(AdSpot, on_delete=models.PROTECT)

    default_length = 255
    for field in AdSpot._meta.fields:
        if field.name == 'title_max_chars':
            default_length = field.default
    title = models.CharField('Name', max_length=default_length, default='') # default value of title_max_chars (22 this case) from AdSpot will be set as a max_length of title
0 голосов
/ 07 июня 2019

Вы можете использовать PositiveIntegerField вместо IntegerField.

class AdSpot(models.Model):

    title_max_chars = models.PositiveIntegerField(default=0)

    @property
    def title_max_chars_from_adspot(self):
        return self.title_max_chars
0 голосов
/ 07 июня 2019

Вы устанавливаете для Adspot.title_max_chars значение по умолчанию, равное 0. Однако max_length всегда должно быть положительным целым числом.старайтесь не указывать значение по умолчанию.

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