Django: как сохранить экземпляр в поле внешнего ключа на основе одинаковых полей
Итак, у меня есть модель user
, которая имеет отношение внешнего ключа с классом/кабинетом, я хочу, чтобы пользователь мог нажать одну кнопку и все пользователи/ученики были бы равномерно распределены по классу/кабинету внешним ключом на основе полей из модели, таких как возраст, рост и другие поля.
Так если есть 4 ученика 2 с возрастом 14 и 2 с возрастом 15 и есть два класса, функция должна поместить одного 14-летнего и одного 15-летнего в один класс и то же самое в другой класс, просто итерация через пользователей и распределить их по выбранным значениям полей одинаково, любой ресурс или фрагмент кода будет высоко оценен.
Я привел фрагмент кода, чтобы вы могли найти решение. Возможно, это не самое эффективное решение. Но у вас будет суть.
def assign_class(request, *args, **kwargs):
age14_users = User.objects.filter(age=14).order_by('-joined_date')
age14_users_pk_list=list(age14_users.values_list('pk', flat=True))
age15_users = User.objects.filter(age=15).order_by('-joined_date')
age15_users_pk_list=list(age15_users.values_list('pk', flat=True))
age14_users_count = len(age14_users_pk_list)
age15_users_count = len(age15_users_pk_list)
classes= Class.objects.all()
class_count = classes.count()
class_pk_list=list(classes.values_list('pk', flat=True))
slice = age14_users_count//class_count
sliced_users_list_age14=[age14_users_pk_list[i:i+slice] for i in range(0, len(age14_users_pk_list), slice)]
#output eg. [[1,2,3],[4,5,6],[7,8]]
#User will be distributed to rooms rationally
'''
if we loop through sliced user clusters.. we can assign
each cluster to room rationally
'''
new_class_pk_list = class_pk_list.copy()
for lst in sliced_users_list_age14:
for user_pk in lst:
user = User.objects.get(pk=user_pk)
user.room_id =new_class_pk_list[0]
user.save()
del new_class_pk_list[0] #delete the class after assigning
#from copied list
'''
Now you can distribute the other cluster of group (eg. age15_users)
like above
'''