皮威。在 CharField 更新时,将单个字符串值保存为模型实例字段中的元组

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

我正面临着 Peewee 的奇怪行为。

对于我的模型(数据库 PostgreSQL):

class Car(BaseTable):
   id = UUIDField(primary_key=True, unique=True, default=uuid4)
   user = ForeignKeyField(SocialUser)
   vendor = CharField(max_length=30)
   model = CharField(max_length=30)
   colour = CharField(max_length=30)
   number = CharField(max_length=30)
   registered_date = DateTimeField(default=datetime.datetime.now)

我正在尝试以这种方式更新一些字段:

with database.atomic():
    car, created = Car.get_or_create(user=record['user'],
                                     number=record['number'],
                                     defaults={'vendor': record['vendor'],
                                               'model': record['model'],
                                               'colour': record['colour']
                                               })

    if not created:
        print(car.vendor, type(car.vendor), len(car.vendor))
        print(record['vendor'], type(record['vendor']), len(record['vendor']))
        car.vendor = record['vendor'],
        car.model = record['model'],
        car.colour = record['colour']
        print('-------------------------------')
        print(type(car.vendor), len(car.vendor))
        print(type(record['vendor']), len(record['vendor']))
        car.save()

对于这些论点:

record['user'] = '3dba2da7-f005-4806-888c-167669a984b0'
record['number'] = 'е123кх777rus'
record['vendor'] = 'Hyundai'
record['model'] = 'Creta'
record['colour'] = 'Green'

控制台结果:

Hyundai <class 'str'> 7  
Hyundai <class 'str'> 7
------------------------------- 
('Hyundai',) <class 'tuple'> 1  
Hyundai <class 'str'> 7

数据库结果:

                  id                  |               user_id                |   vendor    |   model    | colour |    number    |      registered_date       
 28dfdfe6-2230-4d90-94f5-27b2946e8dc6 | 3dba2da7-f005-4806-888c-167669a984b0 | ('Hyndai',) | ('Creta',) | Green  | е123кх777rus | 2021-06-15 09:58:06.583585

但是,如果我使用这种方式:

with database.atomic():
    car, created = Car.get_or_create(user=record['user'],
                                     number=record['number'],
                                     defaults={'vendor': record['vendor'],
                                               'model': record['model'],
                                               'colour': record['colour']
                                               })

    if not created:
        Car.update(vendor=record['vendor'],
                   model=record['model'],
                   colour=record['colour'])\
            .where(Car.id == car.id)\
            .execute()

这工作正常,实例和数据库中没有元组。

你能解释一下为什么吗?

python postgresql peewee
1个回答
0
投票

行尾的逗号与赋值运算符

car.vendor = 记录['供应商'],
car.model = 记录['型号'],

使这些表达式实际上成为元组:

>>> some_variable = "some_string",
>>> type(some_variable)
<class 'tuple'>

比较:

>>> some_variable = "some_string"
>>> type(some_variable)
<class 'str'>

注意db中的“color”没有问题

car.color = 记录['颜色']

© www.soinside.com 2019 - 2024. All rights reserved.