使用UUIDField django初始化模型时出错

时间:2018-01-21 17:10:46

标签: python django

问题:

所以,我一直在尝试使用自定义函数Trade中的标识符的初始值创建模型gen_rand_string()的对象。

但问题是,我正在初始化它。

如果我删除初始值设定项并将UUIDField设置为NULL,那就可以了。

这是错误,我得到了:

  

/ admin / account / trade / add /

中的TypeError      

int()参数必须是字符串或数字,而不是' Trade'

我的交易类:

class Trade(models.Model):
    NEW_TRADE = 'N'
    CANCELLED_TRADE = 'C'
    PENDING_TRADE = 'P'
    STATUS_OF_TRADE = (
        (NEW_TRADE, "New"),
        (CANCELLED_TRADE, "Cancelled"),
        (PENDING_TRADE, "Pending")
    )
    TYPE_BUY = 'B'
    TYPE_SELL = 'S'
    TYPE_OF_TRADE = (
        (TYPE_BUY, "Buy"),
        (TYPE_SELL, "Sell")
    )
    user = models.OneToOneField('UserProfile', related_name='trades')
    identifier = models.UUIDField(null=False, editable=False)
    created_at = models.DateTimeField(auto_now_add=True, editable=False)
    finished_at = models.DateTimeField(auto_now_add=True)
    amount = models.DecimalField(max_digits=19, decimal_places=10, null=False)
    type = models.CharField(max_length=2, choices=TYPE_OF_TRADE, null=False)
    status = models.CharField(max_length=2, choices=STATUS_OF_TRADE, default=PENDING_TRADE, null=False)

    def __init__(self, *args, **kwargs):
        self.identifier = gen_rand_string()
        super(Trade, self).__init__(self, *args, **kwargs)

    class Meta:
        ordering = ('created_at',)

    def __unicode__(self):
        return self.identifier

    def __str__(self):
        return self.identifier

我的 gen_rand_string()

def gen_rand_string(purpose=''):
    if purpose:
        return purpose + '_' + get_random_string(length=64 - len(purpose))
    else:
        return get_random_string(length=64)

建议:

我为每笔交易制作一个随机字符串并不是更好的方式,有人会建议一些更好的选择,或者他们会在他们的位置拥有它。

我正在使用python 2.7,这是我以不同方式初始化对象的原因

感谢。

2 个答案:

答案 0 :(得分:1)

不鼓励您为Django模型覆盖__init__。您使用gen_rand_string作为字段的默认值:

identifier = models.UUIDField(null=False, editable=False, default=gen_rand_string)

但是,您可能不需要定义自己的gen_rand_string方法 - 只需使用uuid.uuid4,就像UUIDField的文档一样。

identifier = models.UUIDField(null=False, editable=False, default=uuid.uuid4)

答案 1 :(得分:0)

问题在于你的init函数语法。

def __init__(self, *args, **kwargs):
    super(Trade, self).__init__(self, *args, **kwargs)
    self.identifier = gen_rand_string()