我希望在名为limit_choices_to
的模型中ForeignKey(User)
Order
,其中User
受User
限制,Place.owner
必须属于{{1} (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
保留为单独的表格,因为我希望User
和UserType
之间的M2M关系仍然受choices
限制。
我欢迎并感谢任何建议或提示。 提前致谢!
答案 0 :(得分:1)
据我所知,limit_choices_to不能在这里使用。您需要限制字段queryset。
我之前在使用通用视图时已经这样做了,所以这里是代码:
# This class extends a generic view, but this can be any view.
class RelationCreateView(CreateView):
def get_form(self, form_class):
# Find all entities a user can promote within, and limit to those.
form.fields['entity'].queryset = <SOME QUERYSET>
return form
在一个更简单的视图示例中:
def view_method():
...
form.fields['field_name'].queryset = <SOME QUERYSET>