The*_*One 18 database django orm many-to-many django-models
我在模特中遇到了一场冲突:
class Visit(models.Model):
user = models.ForeignKey(User)
visitor = models.ForeignKey(User)
Error: One or more models did not validate:
profiles.visit: Accessor for field 'user' clashes with related field 'User.visit_set'. Add a related_name argument to the definition for 'user'.
profiles.visit: Accessor for field 'visitor' clashes with related field 'User.visit_set'. Add a related_name argument to the definition for 'visitor'.
Run Code Online (Sandbox Code Playgroud)
在访客领域使用什么是明智的'related_field'?此模型基本上表示对特定用户的个人资料发生的访问.
我还应该用ManyToManyField替换任何ForeignKey吗?逻辑有点令人困惑.
编辑:这似乎解决了它,但我不确定这是否是我想要的.:)
class Visit(models.Model):
user = models.ForeignKey(User)
visitor = models.ForeignKey(User, related_name='visitors')
Run Code Online (Sandbox Code Playgroud)
Mik*_*one 30
如果有a ForeignKey,它会创建一个以模型名称加上_set引用模型命名的属性.这里的问题是两个外键都想在Usernamed 上创建一个属性visit_set.解决方案是为每个外键添加不同的相关名称.
通常,我使用复数作为相关名称.在这些情况下,我在相关名称中添加了"as"子句:
class Visit(models.Model):
user = models.ForeignKey(User, related_name="visitsAsUser")
visitor = models.ForeignKey(User, related_name="visitsAsVisitor")
Run Code Online (Sandbox Code Playgroud)
您不需要a,ManyToManyField除非您每个Visit或每个用户可以拥有零个或多个访问者Visit.
如果访问在您的应用程序中是一个强大的概念,那么按照您定义的方式进行访问可能是有意义的:访问包括"用户用户"和"用户访问者".
但是,如果访问只是用户之间相互关联的一种方式,那么也许您应该ManyToMany在用户之间建立关系.为此,您应该在用户配置文件中使用ManyToManyField.symmetrical(在其中扩展随附的信息).auth.models.User
在任何情况下,关于related_name,你既可以禁用向后关系,如果你不被访问的访问来自用户,或如使用一个明智的名称visits_to_self上user和visits_to_others上visitor,这样可以让谁看到通过调用访问用户user.visits_to_self和谁是用户通过访问user.visits_to_others.
| 归档时间: |
|
| 查看次数: |
9820 次 |
| 最近记录: |