当我尝试迁移其中一个包含ManyToMany字段的模型列表时,遇到了以下问题。
@JvmField
@Rule
var mActivityRule: ActivityTestRule<MainActivity> = ActivityTestRule(MainActivity::class.java)
var intent = Intent()
@Before
fun init(){
mActivityRule.activity.setRecyclerListener()
mActivityRule.activity.mainViewModel.updateList(0)
}
@Test
fun test(){
}
Class Item(models.Model):
class Item(models.Model):
File "C:\Users\helin\Downloads\Django\E-commerce\Farmers\Farmersapp\models.py", line 60, in Item
sluger = farmer.First_Name
AttributeError: 'ManyToManyField' object has no attribute 'First_Name'
Below are the models i created.any help is appreciated.Thank you
class Farmer(models.Model):
id = models.AutoField(default=1,primary_key=True)
First_Name = models.CharField(max_length=15)
Last_Name = models.CharField(max_length=15)
def __str__(self):
return self.First_Name+" "+self.Last_Name
def get_farmer(self):
return self.farmer.First_Name+" " +self.farmer.Last_Name
ItemAmount(models.Model)类:
id = models.AutoField(default=1,primary_key=True)
category = models.CharField(choices=CATEGORY_CHOICES, max_length=6)
price = models.FloatField()
description = models.TextField(blank=True)
image = models.ImageField()
farmer = models.ManyToManyField(Farmer, through='ItemAmount',related_name='item')
sluger = farmer.First_Name
slug = models.SlugField(default=sluger)
def __str__(self):
return self.category
答案 0 :(得分:0)
首先,建议看看Python style guide,例如小写的属性名称等。
Django会在每个模型上自动创建id
主键字段,除非将其他字段设置为主键。因此,可以安全地避免使用此部分。
get_farmer
方法-与 str 有什么不同?另外,这些都是model instance
方法((self)
),因此self.farmer
对象上没有Farmer
字段-这将失败。
class Farmer(models.Model):
# id AutoFied is created by default by django, so no need to specify
# id = models.AutoField(default=1,primary_key=True)
first_name = models.CharField(max_length=15)
last_name = models.CharField(max_length=15)
def __str__(self):
return self.first_name + " " + self.last_name
farmer = models.ManyToManyField()
-因为它是ManyToMany,这意味着很多农民,所以最好命名字段farmers
,同样适用于反向关系-农民可能有多个项目-related_name=items
sluger
-它是一个字段吗?另外,它可能有很多农民,那么该选哪个?
slug
-在默认情况下引用自身字段不是一个好主意,最好在表单中设置默认值。
例如,您可以创建slug
CharField并通过save()
方法设置其值。
class Item(models.Model):
# id AutoFied is created by default by django, so no need to specify
# id = models.AutoField(default=1,primary_key=True)
category = models.CharField(choices=CATEGORY_CHOICES, max_length=6)
price = models.FloatField()
description = models.TextField(blank=True)
image = models.ImageField()
farmers = models.ManyToManyField(
Farmer,
through='ItemAmount',related_name='items'
)
slug = models.SlugField()
def __str__(self):
return self.category
您可以从最小的工作模型开始,然后一个接一个地添加新的字段/方法-调试起来会更容易,并且您将拥有基本的工作应用。