尝试使用ManyToManyField时,Django模型ForeignKey向后引用和AttributeError

时间:2018-05-20 07:25:47

标签: python django

所以我正在尝试为数据库构建模型,该数据库读取具有给定数据格式的.xml文件,而我在设置向后兼容性方面遇到了麻烦。

我的模特

from django.db import models

class Continent(models.Model):
    name = models.CharField(max_length=60, default='', unique=True)
    code = models.CharField(max_length=3, default='')


    countries = models.ManyToManyField(
        'Continent',
        through='Country',
    )


class Country(models.Model):

    name = models.CharField(max_length=60, default='', unique=True)
    code = models.CharField(max_length=3, default='', unique=True)
    capital = models.CharField(max_length=60, default='')
    population = models.PositiveIntegerField(default=0)
    area = models.PositiveIntegerField(default=0)
    continent = models.ForeignKey(Continent, default='', related_name='related_name')

正如您所看到的,当涉及到related_name时,我有点无能为力。无论如何,运行已经解析过这个数据的测试会给我一个错误

  

AttributeError:'ManyToManyField'对象没有属性'_m2m_reverse_name_cache'

但我不确定如何消除它。

测试尝试运行

fi = europe.countries.get(code="fi")

如果它找不到任何内容(数据包含每个大陆和国家/地区),则会引发异常,因此向后引用尚未起作用。

编辑: 这是引发异常的测试的一部分

def testCountryThroughContinent(self):

        europe = Continent.objects.get(code="eu")
        try:
             sw = europe.countries.get(code="sw")
        except:
             self.assertTrue(False, "Getting country failed. Did you remember that countries should be accessed through attribute countries?")
        self.assertEqual(sw.name, "Sweden", "Getting a country from a continent")

1 个答案:

答案 0 :(得分:0)

如果您将FK用于来自国家的大陆,则不需要额外的M2M

from django.db import models

class Continent(models.Model):
    name = models.CharField(max_length=60, default='', unique=True)
    code = models.CharField(max_length=3, default='')

class Country(models.Model):
    name = models.CharField(max_length=60, default='', unique=True)
    code = models.CharField(max_length=3, default='', unique=True)
    capital = models.CharField(max_length=60, default='')
    population = models.PositiveIntegerField(default=0)
    area = models.PositiveIntegerField(default=0)
    continent = models.ForeignKey(Continent, related_name='countries')

不要忘记执行makemigrations并在此之后应用