0

我想要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简单地输入poUserProfile.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.ownerslimit_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.

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

4

1 回答 1

1

据我所知,limit_choices_to 不能在这里使用。您需要限制字段查询集。

我之前在使用通用视图时已经这样做了,所以这里是代码:

    # 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>
于 2012-05-06T01:58:08.313 回答