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')

然后我可以UserTypeUser做访问User.objects.get(pk=1).user_type.all()。但这使它看起来像是user_type一个领域User

相反,如果我能做类似的事情User.objects.get(pk=1).userprofile-user_type.all(),我就会知道我将从UsertoUserProfile到 to UserType

好吧,我的思维方式可能是少数,我认为大多数人只会这样做related_name='user_type',甚至可能使用 default 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 字段“提供者”和“消费者”及其相关管理器。还要注意必要的查询。我认为它的可读性很好。

所以我建议你根据他们的目的和用途来命名你的字段和相关经理,尽可能少的冗长。

于 2012-05-07T10:26:38.727 回答