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
была помещена в код в расчете на использование ее для (этой) будущей функции. Я могу изменить схему модели, но я бы предпочел этого не делать, если это возможно.