繁体   English   中英

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

[英]How to generate a random product_id int to MySQL when adding a new product via Django Admin

我正在尝试将“product_id”与新产品一起添加到 MySQL 数据库中,以便在运行 Django 的电子商务网站中使用。然后我想使用这些 product_id 值在电子商务网站内进行搜索。 因此,它们只需要 5 个字符长。

models.py 中的产品 class 如下所示:

from django.utils.crypto import get_random_string

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(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()

据我了解,我应该能够设置 integer 的长度,并将其设置为数字 ID,以便在每次在数据库中创建新产品时存储。

如果这个问题很愚蠢,我深表歉意,但这是我在这里的第一个问题,我进行了搜索但找不到解决方案。

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

使用randint将返回 integer 并且最适合此用例。 一种方法是重写 model 保存方法:

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM