0

と呼ばれるモデルに入れたいlimit_choices_toのですが、誰が(M2M)の一部である必要があるかによって制限され、それはからです。ForeignKey(User)OrderUserUserPlace.ownerPlaceOrder.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単にpoinUserProfile.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関係が必要だったので、個別のテーブルとして保持しました。UserUserTypechoices

提案やヒントを歓迎し、感謝します。前もって感謝します!

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 に答える