gpt4 book ai didi

python - Django 自定义模型字段 : to_python() not called

转载 作者:太空狗 更新时间:2023-10-29 20:54:29 27 4
gpt4 key购买 nike

我是 Python 和 Django 的新手,也是 Stack Overflow 的新手,所以我希望我不会在这里违反任何规则,我尊重问题格式。

我在尝试使用 Django(Python 3.3.0、Django 1.5a1)实现自定义模型字段时遇到问题,但我没有找到任何类似的主题,我实际上很纠结于这个...

所以有一个玩家,他有一张手牌。 Hand 继承自 CardContainer,它基本上是具有一些(此处隐藏的)辅助函数的卡片列表。下面是相应的代码:

from django.db import models


class Card:
def __init__(self, id):
self.id = id


class CardContainer:
def __init__(self, cards=None):
if cards is None:
cards = []
self.cards = cards


class Hand(CardContainer):
def __init__(self, cards=None):
super(Hand, self).__init__(cards)


class CardContainerField(models.CommaSeparatedIntegerField):
__metaclass__ = models.SubfieldBase

def __init__(self, cls, *args, **kwargs):
if not issubclass(cls, CardContainer):
raise TypeError('{} is not a subclass of CardContainer'.format(cls))

self.cls = cls
kwargs['max_length'] = 10
super(CardContainerField, self).__init__(*args, **kwargs)

def to_python(self, value):
if not value:
return self.cls()

if isinstance(value, self.cls):
return value

if isinstance(value, list):
return self.cls([i if isinstance(i, Card) else Card(i) for i in value])

# String: '1,2,3,...'
return self.cls([Card(int(i)) for i in value.split(',')])

def get_prep_value(self, value):
if value is None:
return ''

return ','.join([str(card.id) for card in value.cards])


class Player(models.Model):
hand = CardContainerField(Hand)

但是当我得到一个玩家时,可以这样说:Player.objects.get(id=3).hand,而不是得到一个 Hand 实例(甚至是 CardContainer 实例!),我只是得到一个逗号分隔的整数字符串,如“1,2,3”,这在数据库中很好(这是我的格式我想在数据库中看到)...

在我看来,to_python 没有被调用,所以返回的数据是原始值,因此是字符串。当我搜索此类问题时,人们错过了 __metaclass__ = models.SubfieldBase...我希望我也能错过它,但是,嘿,这太简单了!我错过了一些微不足道的事情,还是我错了整件事? :D

非常感谢!!

最佳答案

在 python 3 中,不再支持模块全局 __metaclass__ 变量。您必须使用:

class CardContainerField(models.CommaSeparatedIntegerField, metaclass=models.SubfieldBase):
...

关于python - Django 自定义模型字段 : to_python() not called,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14078755/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com