Проверьте, существует ли в джанго «Много ко многим»?

#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)