@r1mple

Как при создании объекта Юзер в базе данных, создавать другой объект, например Промокод?

То есть, есть объект Юзер, когда пользователь пишет /start боту - он попадает в базу данных.
Отношение 1 к 1, те только один уникальный промокод у одного уникального юзера.
Как мне при создании этого объекта юзер, создавать еще и объект Промокод, и прописывать этот промокод в подно из полей юзера?
Есть у меня в голове решение, но оно костыльное, по-любому есть какое-то просто решение.
Нынешний код
class UserModel(models.Model):
    userStatuses = (
        (1, 'Admin'),  # an admin with all the perms
        (2, 'Just a user'),  # the user who has not bought premium sub
        (3, 'Premium')  # the user who indeed has bought the premium
    )

    userTelegramId = models.IntegerField('Телеграм айди', unique=True)
    userTelegramNickname = models.CharField('Имя пользователя', max_length=50)
    userStatus = models.IntegerField('Статус', editable=True, choices=userStatuses, default=2)
    userBalance = models.DecimalField('Баланс', max_digits=6, decimal_places=0, default=0, help_text='сумма в рублях')
    userPromo = models.CharField('Личный промокод', max_length=10, editable=False, unique=True, default=str(Promo(10)))
    activatedPromo = models.CharField('Активированный промокод', max_length=10, default='No promo')
    # --------------вот так вот наверное это должно выглядеть как-то-------------
    # promocode = models.OneToOneField(PromocodeModel, verbose_name='Промокод', related_name='promo', on_delete=models.CASCADE)

    def __str__(self) -> str:
        return f'Пользователь {self.userTelegramNickname}'

class PromocodeModel(models.Model):
    promo = models.CharField('Промокод', max_length=10, unique=True)
    usesCount = models.IntegerField('Использован(раз)', choices=[(i, i) for i in range(0, 6)], default=0)

И еще на всякий случай вьюшку создания пользователя.
class UserCreateView(APIView):
    def post(self, request) -> Response:
        user = UserCreateSerializer(data=request.data)

        if not user.is_valid():
            return Response({'Error': 'User was not created.', 'status': 0}, status=403)

        user.save()

        return Response(user.data, status=201)
  • Вопрос задан
  • 69 просмотров
Пригласить эксперта
Ответы на вопрос 1
AlexNest
@AlexNest
Работаю с Python/Django
1.Внешние ключи стоит делать от "подчиненных" к "главным" т.е. поскольку промокод принадлежит юзеру, вокруг которого и построена система, то и ключ нужно делать в PromocodeModel.
2. Не понятно, что делает функция Promo в default=str(Promo(10))
Как мне при создании этого объекта юзер, создавать еще и объект Промокод, и прописывать этот промокод в подно из полей юзера?

3. Зачем раздувать базу лишними полями с данными? Продублированный промокод несет какую-то смысловую нагрузку помимо того, что не нужно добавлять поиск по отдельной таблице? Нет? Тогда смело удаляйте одно из мест хранения, т.к. это избыточность данных.
4. Как создавать?
В случае, если оставили поле в модели юзера, то просто генерируйте его "по умолчанию" (Предположу, что именно этим default=str(Promo(10)) и занималась)
В случае с отдельной моделью просто создавайте новый объект как обычно
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы