如何为 ManyToMany 字段添加排序?
How can I add ordering for ManyToMany field?
我有两个模型:CustomUser
和 AgreementReglament
此时模型之间的关系如下所示:
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 Agreement
和 approver_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'
)
如有任何问题,欢迎随时提问。
我有两个模型:CustomUser
和 AgreementReglament
此时模型之间的关系如下所示:
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 Agreement
和 approver_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'
)
如有任何问题,欢迎随时提问。