免责声明:Django模型有时会让我感到困惑。
我有以下情况,我将在JPA中表达,因为它对我来说最有意义:
@Entity
public class Address {
/* fields omitted for brevity */
}
@Entity
public class User {
@OneToMany
private List<Address> addresses;
}
@Entity
public class Location {
@OneToOne
private Address address;
}
@Entity
public class MultiEvent {
@OneToMany
private List<Address> addresses;
}
我如何在Django中表达以下内容:
- 一个用户可以拥有多个地址,但地址不需要向其所有者提供任何参考。
- 一个位置有一个地址,但同样地,地址不需要向其所有者提供任何引用。
- 与第一个场景类似,一个MultiEvent可以有多个地址,但每个地址不需要引用它所属的MultiEvent。
醇>
如何在Django中创建相同的场景?我很容易感到困惑,因为Django中没有OneToMany
字段和ManyToOne
字段,只有ForeignKey
字段。我也找不到ForeignKey
定义的所有已接受构造函数参数的完整文档,这可能解释了为什么我感觉有点迷失。
答案 0 :(得分:1)
您需要Address
中的外键,指向User
。给它一个related_name
,以便您可以直观地参考它。像这样的东西,
class Address(models.Model):
user = models.ForeignKey(User, related_name='addresses')
u = User()
for a in u.addresses.all():
print a # loop through all addresses
使用One to one relationship,免费获得后面的参考资料!
与ForeignKey
到'MultiEvent`
Address
相同
答案 1 :(得分:0)
在django'oneToMany'向ForeignKey求助。 我发现使用相关名称可以帮助缓解这种意义上的混淆:
#models.py
class myModel(Model):
other_item = field(...)
class otherModel(Model):
mymodel = ForeignKey(myModel, related_name="otherModels")
#then you can access all the otherModels as:
#the orm adds this attribute to any instantiated models of myModel
#its the equivalent of otherModel.objects.filter(mymodel=model_instance)
myModelInstance.otherModels.all()
不幸的是,这意味着您必须始终在oneToMany关系的“one”中声明关系。但最终是适当的数据库设计。