0

、、、、、またはその他の数学文字記号を。に含めることはできないことに気付き-ました。、、、またはも使用できません。+/*related_name:|.

上記の文字のいずれかがに含まれている場合related_name、Djangomodels.pyは検証しますが、クエリルックアップを実行すると、次のようなエラーがスローされます。

Q(userprofile.user__place__managers=user)
SyntaxError: keyword can't be an expression

特殊文字を使用したいのはrelated_name、の形をしたいからです{class_name}{field_name}。たとえば、UserProfileモデルクラスの場合、次のようにします。

class UserProfile(models.Model)
    user = models.OneToOneField(User, related_name='userprofile-user')
    user_type = models.ManyToManyFields(UserType, related_name='userprofile-user_type')

そうすれば、関係を逆方向に追跡することを含むクエリを実行しますが、それでも、関係を逆方向に追跡する方法を知っています。たとえば、私が単にする場合

user_type = models.ManyToManyFields(UserType, related_name='user_type')

その後、私はを行うことUserTypeからアクセスできます。しかし、これにより、のフィールドのように見えます。UserUser.objects.get(pk=1).user_type.all()user_typeUser

代わりに、私がそのようなことをすることができれば、私はからにUser.objects.get(pk=1).userprofile-user_type.all()行くことを知っているでしょう。UserUserProfileUserType

私の考え方はおそらく少数派であり、ほとんどの人はrelated_name='user_type'デフォルトを使用するか、使用することさえあると思いますuser_type_set

別の質問は次のようになります:命名の良いスタイルは何related_nameですか?

4

1 に答える 1

2

userprofile-user_typeは有効なPython識別子ではありません。

Pythonは、userprofileからuser_typeを減算しようとしていると見なします。

あなたの特定のケースprofilesでは、十分に関連するマネージャー名になります。

そのため、UserTypeインスタンスがある場合:

utype = UserType.objects.get(...)
utype.profiles.all()

そのユーザータイプに関連付けられているすべてのプロファイルが表示されます。

また、ManyToManyField * s *はありません、「s」を削除してください。

関係の意味を伝えるために必要なものよりも冗長にならないようにしてください。関連する名前の中のフィールド名は冗長で不要です。

更新: 名前を付けないでくださいuserprofiles_from_user_type

それはこれを持っているようなものです:

class Person:
    def PersonWalk(self):
        ...

それ以外の:

class Person:
    def walk(self):
        ...

中間テーブルを使用したより複雑な例を示します

class Service(Model):
    name = models.CharField(max_length=32)

class Person(Model):
    services = models.ManyToManyField('self', through='PersonServiceRel', null=True, related_name='friends', symmetrical=False)

class PersonServiceRel(Model):
    provider = models.ForeignKey(Person, related_name='provided_services')
    consumer = models.ForeignKey(Person, related_name='consumed_services')
    service = models.ForeignKey(Service)

ここで、ある種のサービスを互いに提供している人々がいて、ユーザー「rantaplan」が「追跡」サービスを提供しているかどうか、そして誰に提供しているかを知りたいとしましょう。

rantaplan = Person.objects.get(name='rantanplan')
tracking = Service.objects.get(name='tracking')
PersonServiceRel.objects.filter(provider=rantaplan, service=tracking)
# or
rantaplan.provided_services.filter(service=tracking)

PersonServicesRelのフィールド「provider」と「consumer」およびそれらのrelated_managerに注意してください。必要なクエリにも注意してください。かなり読みやすいと思います。

したがって、フィールドと関連するマネージャーには、目的と使用法に応じて、できるだけ冗長性を持たずに名前を付けることをお勧めします。

于 2012-05-07T10:26:38.727 に答える