Проблема с получением объекта в моделях Django

#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. email в 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 непосредственно при создании вашего пользовательского объекта.