#django #user-profile
#django #профиль пользователя
Вопрос:
Я хочу расширить пользовательскую модель следующим образом:
class Client(models.Model):
business_name = models.CharField(max_length=128)
category = models.ForeignKey(Category) # the beginning of the problem
user = models.ForeignKey(User, unique=True)
class Category(models.Model):
category = models.CharField(max_length=75)
#the problem is here
def create_client_profile(sender, instance, created, **kwargs):
if created:
Client.objects.create(user=instance)
post_save.connect(create_client_profile, sender=User)
Поэтому, когда я пытаюсь синхронизировать БД, он жалуется на то, что category_id не может быть нулевым, а источником проблемы является «create_client_profile». Как я могу это решить?
Если я удалю «create_client_profile», это сработает, но да, я потеряю get_profile().
Что вы думаете об этом как о решении? Я не уверен, что это достаточно Djangoish 🙂
Комментарии:
1. Как сообщение в блоге по этой ссылке может быть недостаточно «Djangoish»? Это буквально так, как рекомендуют документы Django.
2. Я не уверен, что, поскольку он был опубликован в 2008 году, он пытался решить что-то, что теперь стало частью Django. И в начале сообщения он жаловался на то, как Django это делает, поэтому, по его словам, он предлагал что-то лучшее. Вот почему я бросил это здесь, чтобы проверить мнение других
3. Я вижу, он на самом деле рекомендует другой способ доступа к профилю, чем
get_profile()
, но все остальное является стандартным Django. Это все еще не альтернативное «решение». Просто альтернативный способ работы с профилем после реализации стандартного решения Django.
Ответ №1:
Итак, у вас есть сигнал, который автоматически создает клиента всякий раз, когда создается пользователь. Ваша клиентская модель имеет обязательный внешний ключ для категории, но ваш сигнал не устанавливает категорию.
Решение должно быть очевидным: либо создайте свою категорию FK null=True
, либо получите ваш сигнал для получения / создания соответствующей категории.
Комментарии:
1. Я пробовал
null=True
раньше, и это не сработало, но это было из-за ошибки в коде представления. Но теперь это работает. Но я все еще не понимаю сигнал. Как он создаст клиента при создании пользователя, в то время как у клиента также есть обязательное поле имени.2. По умолчанию в CharFields используется пустая строка, если она не указана, поэтому не нарушайте ограничение null.
Ответ №2:
Содержит ли база данных уже данные для Client
? Могут быть записи с null
категорией.
Если вы измените category
строку на Client
:
category = models.ForeignKey(Category, null=True)
помогает ли это?