【问题标题】:Django: how to save instance to a foreign key field based on the fields equallyDjango:如何将实例保存到基于字段的外键字段中
【发布时间】:2022-10-12 21:45:52
【问题描述】:

所以我有一个与班级/房间有外键关系的user 模型,我希望用户能够按下一个按钮,并且所有用户/学生将根据字段平均分布在整个班级/房间外键从年龄,身高等领域的模型。 因此,如果有 4 个学生 2 14 岁和 2 15 岁并且有两个班级,则该功能应将一个 14 岁和一个 15 岁的学生放在一个班级,另一个班级也一样,只需遍历用户并按所选字段值平均分配它们,任何资源或代码 sn-p 都将受到高度赞赏。

用户模型(如果需要)

class User(AbstractBaseUser, PermissionsMixin):

class SEX(models.TextChoices):
    MALE = "MALE", "Male"
    FEMALE = "FEMALE", "Female"


id = models.UUIDField(
    primary_key=True, default=uuid.uuid4, editable=False, unique=True)
sex = models.CharField(
    _("Sex Type"), max_length=50, choices=SEX.choices, default=None, blank=True, null=True)
email = models.EmailField(
    _("Email"), max_length=254, unique=True, default=None, blank=True, null=True)
student_id = models.CharField(
    _("student id"), unique=True, max_length=10, blank=True, null=True)
firstname = models.CharField(max_length=250, blank=False, null=True)
middlename = models.CharField(max_length=250, blank=False, null=True)
lastname = models.CharField(max_length=250, blank=False, null=True)
grade = models.ForeignKey(Grade, verbose_name=_(
    "grade"), on_delete=models.SET_NULL, blank=True, null=True)
room = models.ForeignKey(Class, verbose_name=_(
    "class"), related_name="student_room", on_delete=models.SET_NULL, blank=True, null=True) // class model forignkey
age = IntegerRangeField(min_value=1, max_value=99,
                        default=25, blank=True, null=True)

image = models.ImageField(
    _("photo"), upload_to='user/Users/profile_pic', max_length=None, blank=False, null=True)
joined_date = models.DateTimeField(
    _("created at"), auto_now=False, auto_now_add=True)
has_rated = models.BooleanField(_("Has rated the app"), default=False)
...
class Meta:
    verbose_name = _("User")
    verbose_name_plural = _("Users")
    ordering = ('-joined_date',)

objects = CustomAccountManager()

USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['firstname', 'lastname']

def __str__(self):
    return self.firstname

【问题讨论】:

  • 显示您的数据和模型
  • 补充说,但我只需要某种 sn-p,就知道它是如何制作的。

标签: python django


【解决方案1】:

我已经给出了一个代码 sn-p 供您查找解决方案。它可能不是有效的解决方案。但你应该有要点。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 2013-11-09
    • 2013-07-24
    • 2019-08-10
    • 1970-01-01
    • 2020-10-20
    相关资源
    最近更新 更多