簡體   English   中英

擴展ForeignKey的自定義模型字段的示例

[英]Example of custom model field extending 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,並且它說外鍵不能為null。 如果我繼承自models.Field,那么它可以工作,但不能作為外鍵。 我想看看如何擴展model.ForeignKey的功能。 謝謝。

您是否需要SubfieldBase? 它在幕后做了一些魔術,因此該字段具有一個調用to_python的描述符。 ForeignKey具有不同類型的描述符。 我猜想ForeignKey描述符被subfieldbase描述符覆蓋。 換句話說,它們不兼容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM