我想limit_choices_to
在一个名为Order
模型,其中User
由User
谁必须是Place.owner
(M2M)的部分限制的ForeignKey(User)
,其中即Place
是从Order.place
。limit_choices_to在一个ForeignKey依赖于一个可选字段,在模型类
对不起,这可能是很混乱,所以我会告诉你一些模型。
首先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
简单地一个在UserProfile.user_types.name
(即用户是业主)po
。但这只是一个临时解决方案。 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
为界。
我欢迎并感谢您的任何建议或提示。 提前致谢!