#django
Вопрос:
У меня есть две модели,
Model University:
name = models.CharField(max_length=120)
Model Students:
name = models.CharField(max_length=120)
wishlist = models.ManyToManyField(University, blank=True)
В основном это список желаний, пользователь может добавить университет в свой список желаний, и если щелкнуть повторно по значку сердца, мне нужно удалить список желаний:
Вот мой код:
student = request.user.student
university = University.objects.get(id=pk)
if university.student_set.exists():
student.wishlist.remove(university)
else:
student.wishlist.add(university)
Поэтому, когда пользователь1 добавил университет1 в список желаний, пользователь2 не смог добавить университет1 в список желаний, я не знаю, в чем ошибка !Руководство по просьбам, любые студенты могут добавить любой университет в свой список пожеланий (это требование)
Я думаю, что проблема в утверждении if
Комментарии:
1. Вам не нужно проверять наличие, просто используйте
add(...)
метод. Если объект существует в отношении, Django будет молча игнорировать операцию. Но использование функции add() для уже существующего отношения не будет дублировать это отношение, но все равно вызовет сигналы.
Ответ №1:
Мы можем запретить получение соответствующего студента пользователя в случае, если мы хотим удалить университет из списка пожеланий. Обычно это более безопасно, так User
как у учащегося, у которого нет связанного ученика, тогда не возникнет ошибка:
university = University.objects.get(id=pk)
if university.student_set.filter(user=request.user).exists():
Student.wishlist.through.objects.filter(
university=university,
student__user=request.user
).delete()
else:
request.user.student.wishlist.add(university)
Мы можем немного повысить эффективность .remove(...)
пути, не извлекая .student
данные пользователя, и, таким образом, реализовать это как:
Комментарии:
1. Я не мог понять, не могли бы вы, пожалуйста, рассказать ?
2. Почему мы передаем request.user вместо студентов ?
3. @sixovov947: с
university.student_set.exists()
вами просто проверьте, есть ли по крайней мере один студент , у которого этот университет есть в списке желаний. Но это не сам по себе вошедший в систему пользователь. Таким образом, мы должны отфильтровать таким образом, чтобы проверить, есть ли у вошедшего в систему пользователя университет в списке желаний.4. @sixovov947: мы пропускаем пользователя, потому что фильтруем с
user=request.user
помощью . Обычно это более безопасно: если у пользователя нет связанного ученика, то проверка просто вернет пустой набор запросов. Но вы действительно можете фильтровать с.filter(pk=student)
помощью . Эти два понятия эквивалентны.5. Удивительно, спасибо за руководство ! Изменили код в соответствии с вашим предложением 🙂 и он отлично работает
Ответ №2:
university.student_set.exists()
Это не проверяет наличие какого-либо конкретного ученика. Это должно быть:
university.student_set.filter(id=student.id).exists()
Таким образом, в целом это условие будет :
student = request.user.student
university = University.objects.get(id=pk)
if university.student_set.filter(id=student.id).exists():
student.wishlist.remove(university)
else:
student.wishlist.add(university)