Django - попытка использовать кверисет для создания кверисета на другой модели

Я хочу создать набор запросов для моей модели Student. Затем я хочу использовать студентов из этого набора для создания нового набора для моей модели DoNotPick.

модели:

class Classroom(models.Model):
    classroom_name = models.CharField(max_length=30)
    students = models.ManyToManyField(Student)

    def __str__(self):
        return self.classroom_name

class Student(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    student_first = models.CharField(max_length=30)
    fullname = models.CharField(max_length=60)

    class Meta:
        ordering = ['student_first']

    def __str__(self):
        return self.fullname
        
class DoNotPick(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    do_not_pick = models.BooleanField(default=False)
    student = models.ForeignKey(Student, on_delete=models.CASCADE)

Первый набор запросов, который я создаю, следующий: s = Student.objects.filter(classroom = some_pk) Я пробовал одну вещь, которая не сработала ( отсюда в документации):

values = s.values_list('pk', flat=True)
dontpick = DoNotPick.objects.filter(student__in=list(values))

На моей базе данных разработки, s возвращает 18 объектов, что ожидаемо. Однако dontpick, похоже, возвращает все объекты, он не фильтруется. Он возвращает все 26 объектов в базе данных.

У меня был некоторый успех с этим представлением, я знаю, что набор donotpicks имеет правильный размер (18 объектов):

def donotpick(request, classroom_pk):
    classblock = get_object_or_404(Classroom, pk=classroom_pk)
    students = Student.objects.filter(classroom=classblock)
    dnp = DoNotPick.objects.all()
    donotpicks = set()
    for s in students:
        donotpicks.add(dnp.filter(student=s))
    print(len(donotpicks))
    DoNotPickFormSet = modelformset_factory(
        DoNotPick, fields=('do_not_pick',), extra=0)
    formset = DoNotPickFormSet(request.POST, queryset=donotpicks)
    if request.method == 'POST':
        formset = DoNotPickFormSet(request.POST, queryset=donotpicks)
        if formset.is_valid():
            formset.save()

        return redirect('gradebook:random')

    formset = DoNotPickFormSet(queryset=donotpicks)
    context = {'classblock': classblock}
    context['students'] = students
    context['formset'] = formset

    return render(request, 'gradebook/donotpick.html', context)

Однако вышеприведенное дает ошибку: 'set' object has no attribute 'ordered'. Кроме того, я думаю, что это было бы очень неэффективно, потому что сначала я делаю queryset, который возвращает все DoNotPick объекты.

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

Вернуться на верх