GAE Django nonrel расширяет пользовательскую модель

#google-app-engine #django-nonrel

#google-app-engine #django-nonrel

Вопрос:

Я пытаюсь расширить пользовательские модели с помощью своей пользовательской модели, унаследовав от нее вот так:

 class Profile(User):
   ...
  

Я хотел бы добавить свои пользовательские поля в пользовательскую модель, но django nonrel завершается с ошибкой:

 DatabaseError: Multi-table inheritance is not supported by non-relational DBs.
  

Итак, как я могу решить эту проблему? Мне определенно нужны мои пользовательские поля в пользовательской модели.

Ответ №1:

Вместо переопределения пользовательской модели вам следует создать другой класс, содержащий дополнительные поля, и привязать его к пользовательской модели отношением 1 к 1.

 from django.contrib.auth.models import User

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    nickname = models.CharField(max_length=50)
    ...
    ...
  

Ответ №2:

Вы не можете сделать что-то подобное в google-app-engine. Если вы хотите иметь взаимосвязь в своей модели. Вы должны денормализовать свою модель таким образом, чтобы то же самое можно было достичь способом appengine.Чтобы узнать больше о моделировании в appengine. Вы можете перейти по следующим ссылкам.

моделирование в appengine

Ежедневное моделирование profeth в appengine

Комментарии:

1. Хорошо, спасибо, но ваш ответ связан с простым GAE-способом, а не с django-nonrel

Ответ №3:

Я хотел, чтобы объект request.user был обычным пользовательским объектом, но с добавленными полями. Принятый ответ этого не допускает, поскольку в UserProfile есть участник «user» вместо того, чтобы быть пользователем.

В этой статье объясняется, как вместо этого наследовать от пользователя.

Краткие шаги:

  • Сделать CustomUser наследуемым от User
  • Настройте пользовательский сервер аутентификации для возврата CustomUser

Еще не пробовал.

Комментарии:

1. В django-nonrel вы можете наследовать модели только из абстрактных классов (это потому, что при наследовании модели в Django создаются две таблицы, которые соединяются с помощью объединений, чего вы, очевидно, не можете сделать в django-nonrel)