Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在Django中处理模型之间的两种不同关系_Sql_Django_Django Models - Fatal编程技术网

Sql 在Django中处理模型之间的两种不同关系

Sql 在Django中处理模型之间的两种不同关系,sql,django,django-models,Sql,Django,Django Models,我有一个经纪人模型和一个城市模型,经纪人模型的定义如下: 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) addr

我有一个经纪人模型和一个城市模型,经纪人模型的定义如下:

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)

当然,这会产生一个错误,但我想知道是否有任何方法可以促进一种关系,表明经纪人可以在许多城市工作,但只能在一个城市居住。或者这是一个高级设计问题,我必须创建更多的表来显示这种关系?

当您创建从一个模型到另一个模型的关系时,Django会自动在另一个方向添加反向关系。例如,如果您暂时取消了
区域/u of\u操作
字段,则该字段将起作用,您可以使用代码
city.broker\u 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'.
换句话说,问题不在于拥有从
Broker
City
的多个链接,而是两个链接的自动反向关系具有相同的默认名称。要解决此问题,请使用
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.citilities()
来获取居住在该城市的人的列表

有关关系字段的详细信息,请参阅