Django模型超级用户的外键

时间:2017-06-19 17:25:46

标签: python django model

我有一个django模型Request,它有一个字段Approver,设置为具有超级用户状态的User。我想自动为此字段赋值,以便它在项目管理员之间轮换。欢迎任何建议。提前谢谢。

3 个答案:

答案 0 :(得分:1)

我想到的一个简单的解决方案是在使用请求模型的html模板中,您可以执行一个评估可能的签名用户的函数。类似的东西:  1.在请求模型中添加一个字段,该字段是用户模型的外键  示例:

class Request(models.Model):
some other code...
    assigned_user=models.ForeignKey(User, on_delete=models.CASCADE)

在用户模型中添加一个带符号的布尔值:

class User(models.Model):
    assigned=models.BooleanField(default=False)
  1. 然后在您的html代码中创建请求:
  2. 您可以执行以下操作:

    {% for user in Users %}
        {% if user.isAdmin %}
            {% if not user.assigned %}
                <input name="request.varName">{{User.id}}</input>
            {% endif %}
        {% endif %}
    {% endfor %}
    

    请记住,在您的视图中,您必须调用请求模型和用户模型。您可以通过以下方式实现此目的:

    class RequestCreate(CreateView):
        ... some other code..
            def get_context_data(self, **kwargs):
                context = super(RequestCreate, self).get_context_data(**kwargs)
                context['Users'] = User.objects.all()
                #context['venue_list'] = Venue.objects.all()
                #context['festival_list'] = Festival.objects.all()
                # And so on for more models
        return context
    

    我希望在这里有用。

答案 1 :(得分:0)

您可以将函数作为默认值传递。定义一个像这样的函数

listFragments.get(selectedItem).updateFragment;

并将其添加到审批者字段:

def default_func():
    last_assigned = Request.objects.latest().Approver # gets latest assigned Approver
    # the below if statement always looks for the next superuser pk
    if User.objects.filter(is_superuser=True, pk__gt=last_assigned.pk).exists():
        next_assigned_superuser = User.objects.filter(is_superuser=True, pk__gt=last_assigned.pk)\
            .order_by('pk')[0]
    # if there isn't a superuser with a higher pk than the last_assigned_superuser, it will choose
    # the superuser below or equal to it with the lowest pk. This will handle the case where there is
    # only one superuser without any fuss.
    else:
        next_assigned_superuser = User.objects.filter(is_superuser=True, pk__lte=last_assigned.pk) \
            .order_by('pk')[0]

    return next_assigned_superuser

编辑:为default_func添加了一个返回值。糟糕。

答案 2 :(得分:0)

我在Admin表单中编写了一个函数,该函数将批准者设置为具有最少请求数量的User。对我来说很好。

def get_recipient(self):

    approvers = User.objects.annotate(num_of_requests=models.Count('model_field_related_name')).order_by('num_of_requests')
    return approvers.first()