2011-03-06 75 views
1

我开始学习Django的最近的,不能找到一个简单的问题的答案。 我有2个表:客户端和地址。Django的创建关系的一个一对多

------------------ 
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添加(客户端),但我需要从其他型号参考ADDRES太像用户,雇主...... 请帮我创造与上文关系模型陈述表。

回答

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() 
3

这可能是有用的 - One to many。这是一个正式文件,所以没有什么特别的...

我不知道如果我理解正确的问题,但如果你将定义集合字段作为外键的客户端是什么?那么你应该可以做点像

address = Address.objects.get(collection=123) 
+0

他应该使用一个通用的外键,如果他希望能够使用客户端以外的模型的地址模型。同样看问题(“为了选择所有地址”),似乎每个客户端会有多个地址......您将使用“Addres.objects.filter(collection = 123)”来代替您的答案 – DTing 2011-03-06 13:18:19

+0

是的,好点:) – 2011-03-06 13:25:31