为了账号安全,请及时绑定邮箱和手机立即绑定

通过 Django Admin 添加新产品时如何生成随机的product_id int

通过 Django Admin 添加新产品时如何生成随机的product_id int

www说 2023-12-29 16:42:39
我正在尝试将“product_id”与新产品一起添加到 MySQL 数据库,以便在运行 Django 的电子商务网站中使用。然后,我想使用这些 Product_id 值在电子商务网站内进行搜索。因此,它们的长度只需 5 个字符。models.py 中的产品类如下所示:from django.utils.crypto import get_random_stringclass Product(models.Model):    title = models.CharField(max_length=255)    slug = models.SlugField(max_length=255)    category = models.ForeignKey(Category, related_name='products', on_delete=models.CASCADE)    product_id = models.IntegerField(get_random_string(5, 1234567890))  # Max length 5, numerals only    description = models.TextField(blank=True, null=True)    price = models.FloatField()当尝试将模型迁移到 MySQL 服务器时,我得到:File "C:\Users\user\Desktop\ecommerce\apps\store\models.py", line 18, in <module>   class Product(models.Model): File "C:\Users\user\Desktop\ecommerce\apps\store\models.py", line 22, in Product   product_id = models.IntegerField(get_random_string(5, 1234567890))  # Create a random numeric id for each product File "C:\Users\user\Desktop\ecommerce\venv\lib\site-packages\django\utils\crypto.py", line 74, in get_random_string   return ''.join(secrets.choice(allowed_chars) for i in range(length)) File "C:\Users\user\Desktop\ecommerce\venv\lib\site-packages\django\utils\crypto.py", line 74, in <genexpr>   return ''.join(secrets.choice(allowed_chars) for i in range(length)) File "C:\Users\user\AppData\Local\Programs\Python\Python38\lib\random.py", line 288, in choice   i = self._randbelow(len(seq))TypeError: object of type 'int' has no len()据我了解,我应该能够设置整数的长度,并将其设置为每次在数据库中创建新产品时存储的数字 ID。如果这个问题很愚蠢,我很抱歉,但这是我的第一个问题,我进行了搜索,但找不到解决方案。
查看完整描述

1 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

值得一提的是,您正在将int类型传递给string方法。这就是错误所指示的内容。


使用randint将返回一个整数,最适合此用例。一种方法是重写模型保存方法:


from random import randint


class Product(models.Model):

    title = models.CharField(max_length=255)

    slug = models.SlugField(max_length=255)

    category = models.ForeignKey(Category, related_name='products', on_delete=models.CASCADE)

    product_id = models.IntegerField(null=True, Blank=True)  # Max length 5, numerals only

    description = models.TextField(blank=True, null=True)

    price = models.FloatField()


    def save(self, **kwargs):

        if not self.product_id:

            self.product_id = randint(10000, 99999)

        return super(Product, self).save(**kwargs)


查看完整回答
反对 回复 2023-12-29
  • 1 回答
  • 0 关注
  • 88 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信