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

时间:2019-12-15 09:21:30

标签: django django-models

当我尝试迁移其中一个包含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

1 个答案:

答案 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

您可以从最小的工作模型开始,然后一个接一个地添加新的字段/方法-调试起来会更容易,并且您将拥有基本的工作应用。