我想要limit_choices_to
一个ForeignKey(User)
名为 的模型Order
,其中User
受限于User
谁必须是Place.owner
(M2M) 的一部分,它Place
来自哪里Order.place
。
抱歉,这可能真的很混乱,所以我会向您展示一些模型。
首先Order
:
class Order(models.Model):
creator = models.ForeignKey(User, related_name='order_creator')
place = models.ForeignKey(Place, related_name='order_place')
quote = models.DecimalField(max_digits=8, decimal_places=2, null=True, blank=True)
quote_owner = models.ForeignKey(User, related_name='order_quote_owner', limit_choices_to=Q(userprofile__user_types__name='po'), null=True, blank=True)
目前,如您所见,我必须limit_choices_to
简单地输入po
(UserProfile.user_types.name
该用户是财产所有者)。但这只是一个临时解决方案。这quote_owner
是一个指定哪些User
可以批准报价的字段。
换言之,业主必须能够批准业主拥有的订单的报价。
这是我的疯狂(不正确)猜测:
quote_owner = models.ForeignKey(User, related_name='order_quote_owner', limit_choices_to=Q(place_set=self.place), null=True, blank=True)
使它有点复杂的是它Order.quote_owner
是可选的,因此也是Place.owners
。limit_choices_to
如果没有为某个地方指定所有者,是否可以足够聪明地默默地失败(而不给出任何选择)?
无论如何,这里是Place
:
class Place(models.Model):
name = models.CharField(max_length=135)
owners = models.ManyToManyField(User, related_name='place_owners' , limit_choices_to={'userprofile__user_types': 'po'}, null=True, blank=True)
这里是UserProfile
:
class UserProfile(models.Model):
user = models.OneToOneField(User)
user_types = models.ManyToManyField(UserType, related_name='userprofile_user_types', null=True, blank=True)
place = models.ForeignKey(Place, related_name='userprofile_place', null=True, blank=True)
最后是UserType
:
class UserType(models.Model):
TYPE_CHOICES = (
('ad', 'administrator' ), # 1
('mo', 'moderator' ), # 2
('vi', 'viewer' ), # 3
('pm', 'property manager'), # 4
('po', 'property owner' ), # 5
('vm', 'vendor manager' ), # 6
('ve', 'vendor' ), # 7
('te', 'tenant' ), # 8
)
name = models.CharField(max_length=2, choices=TYPE_CHOICES)
我将其保留UserType
为单独的表,因为我想要之间的 M2M 关系,User
并且UserType
仍然以choices
.
我欢迎并感谢任何建议或提示。提前致谢!