2014-07-16 6 views
0

Может ли кто-нибудь дать мне пример расширения поля модели ForeignKey? Я пытался так:Пример расширения пользовательской модели 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 вызывается ни с ценностями, и он говорит, что внешний ключ не может быть пустым. Если я унаследовал от models.Field это работает, но не как внешний ключ. Я хотел бы видеть, как можно расширить функциональность моделей. ForeignKey. Благодарю.

ответ

0

Вам нужна SubfieldBase? Он совершает некоторую магию за кулисами, так что в поле есть дескриптор, который вызывает to_python. ForeignKey имеет различный дескриптор. Я предполагаю, что дескриптор ForeignKey переопределяется дескриптором subfieldbase. Другими словами, они несовместимы.

+0

Могу ли я сделать их совместимыми? Или я могу заставить его переопределить это? – andunhill

Смежные вопросы