#django #django-models
#django #django-models
Вопрос:
У меня есть форма отправки пользователем, и пользователь указывает свое имя и адрес электронной почты. Каждое электронное письмо связано с сетью (администратором, до регистрации пользователя), и на основе электронной почты пользователя он будет назначен этой сети.
Вот что models.py выглядит так —
class Network(models.Model):
network = models.CharField(max_length=50)
location = models.CharField(max_length=50)
class EmailList(models.Model):
email = models.EmailField(blank=True)
network = models.CharField(max_length=50)
class User(models.Model):
name = models.CharField(max_length=50)
email = models.EmailField(max_length=50)
network = models.ForeignKey(Network)
И в views.py
это то, что я использую, чтобы попытаться вставить запись в базу данных —
User.objects.create(
name = cd['name']
email=cd['email'],
network= EmailList.objects.filter(email=request.POST.get('email'))['network'])
Тем не менее, я получаю исключение TypeError из network=
строки. Какой здесь должен быть синтаксис, чтобы «вытащить» и вставить сеть, связанную с электронной почтой, в базу данных? Что я делаю неправильно
Обновить
Вот код, который я использовал в views.py
, чтобы заставить его работать.
email_list = EmailList.objects.get(email=cd['email'])
network= Network.objects.get(network=email_list.network)
User.objects.create(
name=cd['name'],
email=cd['email'],
network=network)
Когда я попытался установить переменную email = cd['email']
, а затем определить email_list, используя эту переменную следующим образом — email_list = EmailList.objects.get(email=email)
, это вызвало бы исключение, говорящее, что Queryset не найден в emailList, и передало бы строку Unicode.
Почему определение переменной перед ее передачей в этом случае создает строку Unicode, тогда как передача выражения непосредственно в не делает?
Комментарии:
1.
EmailList
должно быть что-то вродеuser
в качестве внешнего ключа кUser
, иnetwork
должен быть внешний ключ кNetwork
вместоCharField
. Таким образом, вы избавите себя от тонны головной боли при поиске.
Ответ №1:
Еще раз, вы не должны использовать данные post напрямую.
Фильтр возвращает набор запросов, а не экземпляр. Похоже, это и является причиной вашей проблемы. Также вам нужно получить сетевой экземпляр вместо строки для установки в User.network:
если электронная почта для списка рассылки и сеть для сетевых моделей уникальны, вы можете сделать следующее, если нет и есть несколько записей, использование get вызовет ошибку.
name = cd.get('name')
email = cd.get('email')
email_list = EmailList.objects.get(email=email)
network = Network.objects.get(network=email_list.network)
User.object.create(name=name, email=email, network=network)
Комментарии:
1. Спасибо за вашу помощь. Теперь, похоже, что логика работает, но я получаю сообщение об ошибке, в котором говорится, что в списке адресов электронной почты не существует соответствующего запроса. Однако, когда я смотрю на базу данных, электронное письмо, которое я указываю, действительно существует, и как сетевые, так и электронные записи уникальны. Кроме того, должен ли я добавлять внешний ключ в столбец «network» в модели класса emailList?
2. Это имеет смысл, потому что ваш список электронной почты имеет отношение «многие к одному» к сетям. У вас может быть много электронных писем, связанных с одной сетью. Также это экономит вам время на поиске вашего сетевого объекта, потому что тогда вы могли бы получить свой объект списка адресов электронной почты и использовать fk непосредственно при создании вашего пользовательского объекта.