Django创建一对多的关系

时间:2011-03-06 11:54:08

标签: python django

我最近开始学习Django,并且找不到简单问题的答案。 我有2个表:Client和Addres。

------------------
CLIENT |
------------------
ID |
NAME |
ADDRES_REF |
------------------

------------------
ADDRES |
------------------
ID |
NAME |
CITY |
COLLECTION |
------------------

它们之间的关系是:client.addres_ref = addres.collection。 为了选择ID等于123的客户端的所有地址,我必须创建这样的查询:

select addres.name, addres.city from addres, client where client.addres_ref=addres.collection and client.id=123;

当然可以创建多对多关系,但我不会为它创建额外的表并更改表的结构。

class Addres(models.Model):       
    address = models.CharField(max_length=150)
    city    = models.ForeignKey(City)




class Client(models.Model):
    addres          =models.ManyToMany(Addres)        
    email           =models.EmailField(blank=True)
    name            =models.CharField(max_length=50)

在Addres模型中添加ForeignKey(Client)是可行的,但是我也需要从其他模型引用Addres,比如User,Employer ...... 请帮我创建一个包含上述表格关系的模型。

2 个答案:

答案 0 :(得分:3)

这可能会有所帮助 - One to many。这是官方文档,所以没什么特别的......

我不确定我是否正确理解了问题,但如果您将收集字段定义为客户端的外键怎么办?然后你应该能够做类似

的事情
address = Address.objects.get(collection=123)

答案 1 :(得分:2)

我认为您需要做的是使用内容类型框架在Addres模型中创建通用外键。

from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic

class Addres(models.Model):
    content_type = models.ForeignKey(ContentType, related_name='addresses')
    object_id = models.IntegerField()
    content_object = generic.GenericForeignKey( )

    address = models.CharField()
    city = models.ForeignKey(City)

class Client(models.Model):
    addresses = generic.GenericRelation( Addres )
    email = models.EmailField()
    name = models.CharField()

然后客户端对象将使用client.addresses返回地址,或者您可以像这样查询Addres模型:

client = Client.objects.get(pk=123)
addresses = Addres.objects.filter(content_object=client)

并且Addres模型也可以链接到其他模型,例如

class User(models.Model):
     addresses = generic.GenericRelation( Addres )
     name = models.CharField()