我最近开始学习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),但是我也需要从其他模型(例如User,Employer)中引用Addres。
请帮我从上述表格创建具有关系的模型。
最佳答案
我认为您需要做的是使用内容类型框架在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()