Django创建一对多关系
我最近开始学习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()