如何在Django Admin添加新产品时向MySQL生成随机product_id int



我正在尝试添加一个"product_id";在运行Django的电子商务网站中使用MySQL数据库。然后我想使用这些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:UsersuserDesktopecommerceappsstoremodels.py", line 18, in <module>
class Product(models.Model):
File "C:UsersuserDesktopecommerceappsstoremodels.py", line 22, in Product
product_id = models.IntegerField(get_random_string(5, 1234567890))  # Create a random numeric id for each product
File "C:UsersuserDesktopecommercevenvlibsite-packagesdjangoutilscrypto.py", line 74, in get_random_string
return ''.join(secrets.choice(allowed_chars) for i in range(length))
File "C:UsersuserDesktopecommercevenvlibsite-packagesdjangoutilscrypto.py", line 74, in <genexpr>
return ''.join(secrets.choice(allowed_chars) for i in range(length))
File "C:UsersuserAppDataLocalProgramsPythonPython38librandom.py", line 288, in choice
i = self._randbelow(len(seq))
TypeError: object of type 'int' has no len()

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

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

值得一提的是,您正在将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)

最新更新