Django: пользовательский метод сохранения с набором запросов - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь создать custom save method в своей модели, и я хотел бы получить вашу помощь для ее улучшения.

Я генерирую unique code на основе некоторых переменных вмой form.Я генерирую код и провожу исследование, прежде чем сохранить его.Если другой документ уже получает этот код, я генерирую другой, иначе я сохраняю объект.

Это мой метод save() в моем файле models.py:

def save(self, *args, **kwargs):
    import random
    self.code = f"{self.publication.pub_id}-{self.language.upper()}-{self.format.upper()}-{random.randint(1,10001)}"
    document = Document.objects.filter(code=self.code)
    if document:
        self.code = f"{self.publication.pub_id}-{self.language.upper()}-{self.format.upper()}-{random.randint(1,10001)}"
    super(Document, self).save(*args, **kwargs)

Я думаюэто могло бы улучшить меня на while вместо if состояния.

Что вы думаете об этом?

Спасибо

Ответы [ 3 ]

0 голосов
/ 27 ноября 2018

Я использую while, чтобы проверить, является ли мой код уникальным, это самоочевидно, и я изменил для вашего кода:

def _get_unique_code(self):
    """

    To be used only once in the save method. It creates the unique code.

    """
    import random
    self.code = f"{self.publication.pub_id}-{self.language.upper()}-{self.format.upper()}-{random.randint(1,10001)}"
    while Document.objects.filter(code=self.code).exists():
        self.code = f"{self.publication.pub_id}-{self.language.upper()}-{self.format.upper()}-{random.randint(1,10001)}"
    return self.code

def save(self, *args, **kwargs):
    if not self.code:
        self.code = self._get_unique_code()
    super(Document, self).save()
0 голосов
/ 27 ноября 2018

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

Сказав, что это - while, который вы, возможно, искалидля.

import random
def get_code(self):
    self.code = f"{self.publication.pub_id}-{self.language.upper()}-{self.format.upper()}-{random.randint(1,10001)}"
    while Document.objects.filter(code=self.code).exists():
        self.code = f"{self.publication.pub_id}-{self.language.upper()}-{self.format.upper()}-{random.randint(1,10001)}"
    return self.code

def save(self, *args, **kwargs):
    if not self.code:
        self.code = self.get_code()
    super(Document, self).save()
0 голосов
/ 27 ноября 2018

Я предполагаю, что метод save () относится к модели Document, и я думаю, что self.code всегда будет уникальным (из-за pub_id и randomint), поэтому if/while выглядит мне ненужным.

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