Django创建一对多关系

1 投票
2 回答
2362 浏览
提问于 2025-04-16 13:06

我最近开始学习Django,但有个简单的问题找不到答案。现在我有两个表: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是可行的,但我还需要从其他模型(比如User(用户)、Employer(雇主)等)引用Addres。请帮我创建上述表之间的关系模型。

2 个回答

3

这可能会对你有帮助 - 一对多关系。这是官方文档,所以没什么特别的……

我不太确定我是否理解了问题,但如果你把集合字段定义为指向客户的外键,那你就应该能够做类似下面的事情:

address = Address.objects.get(collection=123)
2

我觉得你需要做的是使用内容类型框架,在地址模型中创建一个通用的外键。

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 来获取地址,或者你也可以像这样查询地址模型:

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

而且地址模型还可以和其他模型关联,比如:

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

撰写回答