在依赖于该模型类中的可选字段的ForeignKey中的limit_choices_to

时间:2012-05-05 20:34:55

标签: python django django-models

我希望在名为limit_choices_to的模型中ForeignKey(User) Order,其中UserUser限制,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保留为单独的表格,因为我希望UserUserType之间的M2M关系仍然受choices限制。

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

1 个答案:

答案 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>