2012-05-07 7 views
0

-+/*、またはその他の数学的文字記号をrelated_nameに含めることができません。 :|、または.も使用できません。関係のDjangoモデルのrelated_nameにはどのような文字制限がありますか?

あなたはDjangoのmodels.pyが検証されますが、クエリの検索を行うたび、それは

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

私は特殊文字を使用したい理由のようなエラーがスローされます、related_nameに上記のいずれかの文字を持っている場合私は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') 

をすれば、私はUser.objects.get(pk=1).user_type.all()をやってUserからUserTypeにアクセスすることができます。しかし、これはuser_typeのように見えますが、フィールドはUserです。代わりに

私はUser.objects.get(pk=1).userprofile-user_type.all()ような何かを行うことができれば、私は私がUserUserProfileからUserTypeに行くのだということを知っているだろう。

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

もう1つ質問があります:related_nameという名前のいいスタイルは何ですか?

+1

回答には良い情報がありますが、意味が分かりにくいです。 TL; DR集団の場合:アルファベットとアンダースコアを付けるだけです(小文字)。 –

答えて

2

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

あなたはuserprofileからuser_typeを減算しようとしているとPythonは考えています。

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

あなたがのUserTypeインスタンスを持っている場合ようにするため:それはあなたのそのユーザタイプに関連付けられているすべてのプロファイルを与えるだろう

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

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

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

UPDATE:

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

の代わりに::

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

私はあなたとのより複雑な例を挙げてみましょう は、それがこれを持つようなものだ、それをuserprofiles_from_user_type

に名前を付けないでください中間テーブル

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に注意してください。 必要なクエリにも注意してください。私はそれがかなり読めると思います。

したがって、可能な限り冗長で、目的や使用方法に応じてフィールドと関連マネージャの名前を付けることをお勧めします。

+0

私は 'related_name'として' userprofiles_from_user_type'を使うことを考えています。ちょっと長いですが、本当に私にとって意味があるようです。あなたは、 "関連する名前の中のフィールド名は重複していて不要です"と書いています。だから 'related_name'の命名規則は何ですか? – hobbes3

+0

@ hobbes3私は自分の答えを更新しました。さらなる説明や簡単な例が必要な場合は、私に叫び声をください – rantanplan

関連する問題