Python Django model ForeignKey在尝试使用ManyToManyField时向后引用和属性错误
因此,我试图为一个数据库构建模型,该数据库读取一个具有给定数据格式的.xml文件,但在设置向后兼容性时遇到了问题 我的模特是Python Django model ForeignKey在尝试使用ManyToManyField时向后引用和属性错误,python,django,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='')
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')
正如你们所看到的,当涉及到相关的名字时,我有点不知所措。无论如何,运行一个已经解析了这些数据的测试会给我带来错误
AttributeError:“ManyToManyField”对象没有属性“\u m2m\u reverse\u name\u 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")
如果您使用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
,然后应用它们在现实生活中你到底想实现什么?鉴于名称,您的方法看起来过于复杂。在这一阶段,我只是尝试为数据库创建模型,并且我已经获得了一个预制测试函数,以确保它能够正常工作。我现在只有一个例外,我将把它编辑到问题中,我需要大陆类具有属性“countries”,但是,大陆内的国家将存储在哪里code@Grak是的,我理解这一点,这是通过添加您已经完成的ForeignKey国家/地区模型来实现的。如果你使用这个模型,你可以做fi=europe.countries.get(code=“fi”)
Ah,所以相关的名称必须是'countries',这样大陆类才能获得属性,我明白了。谢谢(之前没有注意到名称的更改)