2012-05-05 33 views
0

我想limit_choices_to在一个名为Order模型,其中UserUser谁必须是Place.owner(M2M)的部分限制的ForeignKey(User),其中即Place是从Order.placelimit_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关系UserUserType之间的臀围仍然以choices为界。

我欢迎并感谢您的任何建议或提示。 提前致谢!

回答

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> 
相关问题