我最近开始学习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 ...... 请帮我创建一个包含上述表格关系的模型。
答案 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()