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

问题描述 投票:0回答:1

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

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

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

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

如果这个问题很愚蠢,我很抱歉,但这是我的第一个问题,我搜索后找不到解决方案。

python mysql django django-models random
1个回答
1
投票

值得一提的是,您正在将

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)
© www.soinside.com 2019 - 2024. All rights reserved.