【问题标题】:Work Around 2 Different Relationships Between Models in Django处理 Django 中模型之间的 2 种不同关系
【发布时间】:2011-04-01 03:24:49
【问题描述】:

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

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)

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

【问题讨论】:

    标签: sql django django-models


    【解决方案1】:

    当您创建从一个模型到另一个模型的关系时,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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-30
      • 1970-01-01
      • 2012-09-12
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 2018-07-11
      相关资源
      最近更新 更多