【问题标题】:Example of custom model field extending ForeignKey扩展 ForeignKey 的自定义模型字段示例
【发布时间】:2014-09-06 14:21:57
【问题描述】:

谁能给我一个扩展 ForeignKey 模型字段的例子?我试过这样:

class ForeignKeyField(forms.ModelChoiceField):
    def __init__(self, *args, **kwargs):
        super(ForeignKeyField, self).__init__(Chain.objects.all(), *args, **kwargs)
    def clean(self, value):
        return Chain.objects.get(pk=value)      

class CustomForeignKey(models.ForeignKey):
    description = "key from ndb"
    __metaclass__ = models.SubfieldBase

    def __init__(self, *args, **kwargs):
        super(CustomForeignKey, self).__init__(*args, **kwargs)


    def db_type(self, connection):
        return "ndb"

    def to_python(self, value):
        # import pdb; pdb.set_trace()
        from google.appengine.api.datastore_types import Key

        if isinstance(value, Key) is True:
            return value.id()
        if value is None:
            return
        return value

    def get_db_prep_save(self, value, connection, prepared=False):
        save_value = ndb.Key(API_Chain, value.id).to_old_key()
        return save_value

    def formfield(self, **kwargs):
        return models.Field.formfield(self,ForeignKeyField, **kwargs)

我不知道为什么,但如果我使用__metaclass__ = models.SubfieldBase,to_python 会被调用为 None 值,它说外键不能为空。如果我从 models.Field 继承,它可以工作,但不能作为外键。 我想看看如何扩展models.ForeignKey 的功能。谢谢。

【问题讨论】:

    标签: django django-models djangoappengine


    【解决方案1】:

    您需要 SubfieldBase 吗?它在幕后做了一些魔术,因此该字段有一个调用 to_python 的描述符。 ForeignKey 有不同类型的描述符。我猜 ForeignKey 描述符被 subfieldbase 描述符覆盖。换句话说,它们不兼容。

    【讨论】:

    • 我可以让它们兼容吗?或者我可以强制它覆盖它吗?
    猜你喜欢
    • 2018-07-21
    • 2015-10-11
    • 2012-05-01
    • 2011-02-22
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    相关资源
    最近更新 更多