Проверка наличия такого же объекта в базе данных, когда пользователь пытается добавить новый объект - PullRequest
1 голос
/ 04 мая 2020

У меня есть приложение, которое пользователи могут посещать, какие курсы они посещают, и между пользователями и курсом существует множество отношений. Теперь, когда пользователь хочет добавить курс, я хочу проверить, не добавили ли он один и тот же курс с частично одинаковым значением, например, с тем же кодом курса и годом. В настоящее время мой взгляд:

@login_required
def course_add(request):

    if request.method == "POST":
        form = CourseForm(request.POST or none)
        if form.is_valid():
            course = form.save(False)
            for c in request.user.courses.all():
                if course.course_code == c.course_code and course.course_year == c.course_year:
                    form = CourseForm
                    message = "It's seems you already have added this course please try again."
                    context = {
                        'form':form,
                        'message': message,
                    }
                return render(request,'home/courses/course_add.html', context)
            request.user.courses.add(course)
            return redirect('home:courses')
    else:
        form = CourseForm
    context = {
        'form':form
    }
    return render(request,'home/courses/course_add.html', context)

в моей пользовательской модели у меня есть эта строка:

courses = models.ManyToManyField('home.Course',related_name='profiles')

моя модель курса:

class Course(models.Model):
    course_code = models.CharField(max_length=20)
    course_name = models.CharField(max_length=100)
    course_year = models.IntegerField(('year'), validators=[MinValueValidator(1984), MaxValueValidator(max_value_current_year())])

    def __str__(self):
        return self.course_code

Как вы Я вижу, что я не хочу, чтобы пользователь мог добавлять курс, если у него есть код и год существует независимо от названия курса. Как я могу добиться этого, используя exists(), если возможно

1 Ответ

0 голосов
/ 04 мая 2020

Вы можете выполнить запрос через request.user.courses, чтобы выяснить это следующим образом:

if form.is_valid():
    course = form.save(False)
    has_coursed = request.user.courses \
        .filter(course_code=course.course_code, course_year=course.course_year).exists()
    if has_coursed:
        # ... all your other logic

Вам следует избегать всякий раз, когда возможно l oop по набору запросов (по крайней мере, без выполнения prefetch_related в случае отношений ManyToMany), поскольку это подразумевает выполнение дополнительных обращений к базе данных в большинстве случаев.

...