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
    '''

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