我应该如何定义许多不同模型所拥有的模型?

时间:2011-08-16 00:04:20

标签: django django-models

免责声明: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中表达以下内容:

  
      
  1. 一个用户可以拥有多个地址,但地址不需要向其所有者提供任何参考。
  2.   
  3. 一个位置有一个地址,但同样地,地址不需要向其所有者提供任何引用。
  4.   
  5. 与第一个场景类似,一个MultiEvent可以有多个地址,但每个地址不需要引用它所属的MultiEvent。
  6.   

如何在Django中创建相同的场景?我很容易感到困惑,因为Django中没有OneToMany字段和ManyToOne字段,只有ForeignKey字段。我也找不到ForeignKey定义的所有已接受构造函数参数的完整文档,这可能解释了为什么我感觉有点迷失。

2 个答案:

答案 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,免费获得后面的参考资料!

与第一个场景类似,一个MultiEvent可以有多个地址,但每个地址不需要引用它所属的MultiEvent。

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”中声明关系。但最终是适当的数据库设计。