如何为 ManyToMany 字段添加排序?

How can I add ordering for ManyToMany field?

我有两个模型:CustomUserAgreementReglament 此时模型之间的关系如下所示:

class AgreementReglament(models.Model):
    name = models.CharField(max_length=32) # just name of the reglament
    approvers = models.ManyToManyField( # set of users to approve
        'CustomUser',
        related_name='agreement_reglaments'
    )

我如何设置批准者的顺序(例如,CustomUser1 应该是第一个,特别是 AgreementReglament1,CustomUser2 应该是第二个等等,但在 AgreementReglament2 中,CustomUser2 可以是第一个)

更新:排序基于POST请求数据 post 请求创建 AgreementReglament 的示例:

{
        "name": "Reglament1",
        "approvers": [
             {
                  "approver_name": "Alex",
                  "approver_order": 1,
             },
             {
                  "approver_name": "Bob",
                  "approver_order": 2,
             }
        ]
    }

更新2


class AgreementReglament(models.Model):
    name = models.CharField(max_length=32) # name of the reglament
    approvers = models.ManyToManyField( # set of users to approve
        'CustomUser',
        related_name='agreement_reglaments',
        through='Approval'
    )


class Approval(models.Model):
    user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
    agreement = models.ForeignKey(
        AgreementReglament,
        on_delete=models.SET_NULL,
        blank=True,
        null=True
    )
    order = models.IntegerField()

如果您的意思是批准人订单值将作为一个字段输入,那么我会创建一个模型,例如 Approvals,它将有一个 FK field for User 和一个 FK field for Agreementapprover_order 的第三个字段。并让协议模型只有名称字段。 但是,如果你的意思是根据条件排序,这个问题需要更多的细节来澄清(排序是基于什么?你要排序的字段到底是什么?)

更新: 看到您的更新后,我了解到您是从 POST 请求数据中获得此排序的,对于您提供的示例,您肯定需要一个字段来存储每个用户的订单。 我建议采用相同的答案,在中间创建一个模型,并 link 使用 through 属性使用该模型的两个模型,可能如下所示:

class Approval(models.Modal):
    user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
    agreement = models.ForeignKey(AgreementReglament, ...)
    order = models.#whatever you want this char or int

在其他模型中(并不重要)它们应该是这样的:

class AgreementReglament(models.Model):
    name = models.CharField(max_length=32) # just name of the reglament
    approvers = models.ManyToManyField( # set of users to approve
        'CustomUser',
        related_name='agreement_reglaments', through='Approval'
    )

如有任何问题,欢迎随时提问。