0

django-mongodb-engine을 사용하여 사이트를 만듭니다.사용자 정의 사용자 모델의 EmbeddedModelField

나는 다음과 같습니다 사용자 정의 사용자 모델을 가지고 :

class User(AbstractUser): 
    trigrama = models.CharField(max_length=3, unique=True) 
    external_email = models.EmailField(unique=True) 
    phone_number = models.CharField(max_length=20, unique=True) 

    AbstractUser._meta.get_field_by_name('email')[0]._unique=True 

    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = [ 
     'first_name', 'last_name', 'trigrama', 
     'external_email', 'phone_number', 'username' 
    ] 

그냥 잘 작동하지만 그때는 사용자 모델에 포함 된 문서를 추가하는 시도 :

permissions = EmbeddedModelField('Permission') 

Permission가있다 다음과 같은 클래스 :

class Permission(models.Model): 
    computers = ListField(EmbeddedModelField('Computer')) 
    projects = ListField(EmbeddedModelField('Project')) 
    scripts = ListField(EmbeddedModelField('Script')) 

이제 우리를 크레이트로 만들려고 할 때 내가 사용 Permission()에 기본 설정을 시도

Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "C:\Python27\lib\site-packages\django\db\models\manager.py", line 149, in create 
    return self.get_query_set().create(**kwargs) 
    File "C:\Python27\lib\site-packages\django\db\models\query.py", line 416, in create 
    obj.save(force_insert=True, using=self.db) 
    File "C:\Python27\lib\site-packages\django\db\models\base.py", line 548, in save 
    force_update=force_update, update_fields=update_fields) 
    File "C:\Python27\lib\site-packages\django\db\models\base.py", line 668, in save_base 
    result = manager._insert([self], fields=fields, return_id=update_pk, using=using, raw=raw) 
    File "C:\Python27\lib\site-packages\django\db\models\manager.py", line 215, in _insert 
    return insert_query(self.model, objs, fields, **kwargs) 
    File "C:\Python27\lib\site-packages\django\db\models\query.py", line 1675, in insert_query 
    return query.get_compiler(using=using).execute_sql(return_id) 
    File "C:\Python27\lib\site-packages\djangotoolbox\db\basecompiler.py", line 583, in execute_sql 
    "field) to None!" % field.name) 
IntegrityError: You can't set permissions (a non-nullable field) to None! 

: User.objects.create() 나는 다음과 같은 오류 얻을 사용하여 셸에서 어 다음

permissions = EmbeddedModelField('Permission', default=Permission()) 

하지만를 나는 다음과 같은 오류 얻을 :

Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "C:\Python27\lib\site-packages\django\db\models\manager.py", line 149, in create 
    return self.get_query_set().create(**kwargs) 
    File "C:\Python27\lib\site-packages\django\db\models\query.py", line 416, in create 
    obj.save(force_insert=True, using=self.db) 
    File "C:\Python27\lib\site-packages\django\db\models\base.py", line 548, in save 
    force_update=force_update, update_fields=update_fields) 
    File "C:\Python27\lib\site-packages\django\db\models\base.py", line 668, in save_base 
    result = manager._insert([self], fields=fields, return_id=update_pk, using=using, raw=raw) 
    File "C:\Python27\lib\site-packages\django\db\models\manager.py", line 215, in _insert 
    return insert_query(self.model, objs, fields, **kwargs) 
    File "C:\Python27\lib\site-packages\django\db\models\query.py", line 1675, in insert_query 
    return query.get_compiler(using=using).execute_sql(return_id) 
    File "C:\Python27\lib\site-packages\djangotoolbox\db\basecompiler.py", line 579, in execute_sql 
    connection=self.connection 
    File "C:\Python27\lib\site-packages\djangotoolbox\fields.py", line 364, in get_db_prep_save 
    (embedded_model, type(embedded_instance))) 
TypeError: Expected instance of type <class 'users.models.Permission'>, not <type 'unicode'>. 

을 그렇다면 사용자 정의 사용자 모델에 포함 된 문서를 추가하는 방법은 무엇입니까?

P. 쉘에 Permission()을 입력하면 괜찮습니다. 유니 코드가 아닌 Permission object을 반환합니다.

+0

사용자 개체를 만드는 방법을 보여줍니다. –

답변

3

If you read the docs 필드의 기본값을 설정하는 방법에 대해서는 값 또는 a callable object을 수신 할 것으로 예상됩니다. 당신은 그냥 그 (강조 광산)처럼 작동하지 않습니다 다음 거기 인스턴스를 만들 수 없습니다 : 당신이 자신을 호출

The default cannot be a mutable object (model instance, list, set, etc.), as a reference to the same instance of that object would be used as the default value in all new model instances.

(즉 Permission()) 당신이 얻을 것은 인스턴스 인에 turn, 유니 코드를 리턴한다 (이것은 __unicode__ 함수를 호출한다).

즉, 바로이 () 뒤 드롭 : 실제로 하지 않기 때문에,

permissions = EmbeddedModelField('Permission', default=Permission) 

자, 진실성,이 문제가 될 수있는 것은이 새 권한 객체를 저장하고, 모든 일을 수행 할 수 있습니다 지저분 해지기 (이 권한과 모든 것, 당신은 더 조심하고 싶다). 그래서 작업을 마무리 할 수있는 함수를 만드는 더 좋을 수도, 대신 사용 :

def get_initial_perms(): 
    p = Permission() 
    p.save() 
    return p 

# later: 
permissions = EmbeddedModelField('Permission', default=get_initial_perms) 

비슷한 솔루션이 될 것이다는 save() 방법을 무시하고 acutal에게 save 일부를 호출하기 전에 객체에게 권한을 부여 할 수 있습니다.

관련 문제