2011-04-01 68 views
1

我有一个经纪人模式和城市模型,像这样定义的经纪人模式:解决2不同的关系模式之间的Django

class Broker(models.Model): 
    user = models.ForeignKey(Auth) 
    areas_of_operation = models.ManyToManyField(City) 
    phone = models.CharField(max_length=20) 
    company_name = models.CharField(max_length=50) 
    address1 = models.CharField(max_length=100) 
    address2 = models.CharField(max_length=100) 
    city = models.ForeignKey(City) 
    state = models.ForeignKey(State, unique=True) 
    zip = models.IntegerField(max_length=5) 

当然,这将产生一个错误,但我不知道是否有任何方式我都可以促成一种关系,表明一个经纪人可以在许多城市工作,但只生活在一个城市。或者这是一个高层次的设计问题,我必须创建更多的表格来展示这种关系?

回答

3

当您创建从一个模型到另一个模型的关系时,Django会自动在另一个方向上添加一个反向关系。例如,如果您暂时清除了areas_of_operation字段,则该字段可以正常工作,您可以使用代码city.broker_set()获取居住在特定城市的所有经纪人。但是,当您创建从一个模型到另一个模型的多个链接时,Django会尝试使用相同的属性名称创建多个反向关系。这是由错误消息,当您在为模型manage.py validate证实:

Error: One or more models did not validate: 
myapp.broker: Accessor for field 'city' clashes with related m2m field 'City.broker_set'. Add a related_name argument to the definition for 'city'. 
myapp.broker: Accessor for m2m field 'areas_of_operation' clashes with related field 'City.broker_set'. Add a related_name argument to the definition for 'areas_of_operation'. 

换句话说,这个问题是不是有多个链接从BrokerCity,但具有相同的默认,而自动反向关系两个链接的名称。要解决此问题,请使用related_name参数来设置用于反向关系的名称。下面的代码为我工作:

from django.contrib.auth.models import User 
from django.db import models 

class State(models.Model): 
    name = models.CharField(max_length=100) 

class City(models.Model): 
    name = models.CharField(max_length=100) 

class Broker(models.Model): 
    user = models.ForeignKey(User) 
    areas_of_operation = models.ManyToManyField(City, related_name='operators') 
    phone = models.CharField(max_length=20) 
    company_name = models.CharField(max_length=50) 
    address1 = models.CharField(max_length=100) 
    address2 = models.CharField(max_length=100) 
    city = models.ForeignKey(City, related_name='citizens') 
    state = models.ForeignKey(State, unique=True) 
    zip = models.IntegerField(max_length=5) 

现在,如果你有一个City对象,你可以调用city.operators()得到的在这个城市city.citizens()对于谁住在这里的名单谁经营,和一个列表。

有关关系字段的更多信息,请参阅Django model field documentation