'NoneType'对象没有'to_bytes'属性

时间:2017-07-17 09:48:07

标签: python django forms postgresql base64

python上的新功能,很难解决错误代码。

我有一个向postgresql数据库添加行的表单。表单有一个autofield,它是我的models.py中的主键。添加行作为这样的工作,uniqueid字段计数就像inteded(1,2,3,...)

models.py:

class forwards(models.Model):
    uniqueid = models.AutoField(primary_key=True)
    user = models.CharField(max_length = 150)
    urlA = models.CharField(max_length = 254)
    counterA = models.DecimalField( max_digits=19, decimal_places=0,default=Decimal('0'))
    urlB = models.CharField(max_length = 254)
    counterB = models.DecimalField( max_digits=19, decimal_places=0,default=Decimal('0'))
    timestamp = models.DateTimeField('date created', auto_now_add=True)
    shortcodeurl = models.CharField(max_length = 254)

forms.py:

class AddUrlForm(forms.ModelForm):

    class Meta:
        model = forwards
        # fields = '__all__'
        exclude = ["user", "counterA", "counterB", "shortcodeurl", "uniqueid"]

目标是使用主键值(根据here应该是一个整数),将其转换为“bytes”,然后执行bytes-to-base64转换以创建shortcode-url。我想将这个短代码存储在表格中。我尝试在views.py

中执行此操作

views.py

def forwardthis(request):
    forwardform = AddUrlForm(request.POST or None)
    if forwardform.is_valid():
        forward = forwardform.save(commit=False)
        forward.user = request.user.username
        uniqueid_local = forward.uniqueid
        print(uniqueid_local)
        uniqueid_local_bytes = uniqueid_local.to_bytes(3, byteorder='big')
        shortcodeurl_local  = urlsafe_base64_encode(uniqueid_local_bytes)
        forward.shortcodeurl = shortcodeurl_local
        forward.save()

我的问题:

我没有成功创建此短代码网址并且收到“NoneType”错误。我尝试将models.py修改为BigIntegerField和IntegerField,但这不起作用。在我第一次提交表单时,将" default=0 "添加到uniqueid = models.AutoField(primary_key=True)时没有产生任何错误,但是在提交第二个表单时,它会出错[{1}}

对我而言,null value in column "timestamp" violates not-null constraint似乎不像整数那样被识别。如何解决这个问题?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

AutoFields由数据库本身设置,因此在保存之前不要获取值。但是你还没有保存,因为你将commit=False传递给了表格保存;这会在内存中创建一个实例,但不会将其发送到数据库。

如果您希望这样做,则必须删除commit=False并接受两次保存到数据库的(微小)成本。