gpt4 book ai didi

python - Django 属性错误 : 'ForwardManyToOneDescriptor' object has no attribute

转载 作者:行者123 更新时间:2023-12-01 08:07:58 25 4
gpt4 key购买 nike

我在一个应用程序中有 4 个相关模型:

class AssetType(models.Model):
id = models.AutoField(primary_key=True)
type_name = CaseInsUniqueCharField(name='Type Name')
parent = models.ForeignKey('self', on_delete=models.CASCADE, blank=True, null=True, verbose_name='parent')
type_field = models.ManyToManyField('AssetField', blank=True)
history = HistoricalRecords()

# Return Asset Name for Queries
def __str__(self):
return self.type_name

class AssetField(models.Model):
id = models.AutoField(primary_key=True)
field_name = CaseInsUniqueCharField(name='Field Name')
history = HistoricalRecords()

# Return Field Name for Queries
def __str__(self):
return self.field_name

class AssetFieldValue(models.Model):
id = models.AutoField(primary_key=True)
value = models.CharField('value', blank=True, max_length=100)
field = models.ForeignKey('AssetField', on_delete=models.CASCADE, blank=False)
asset = models.ForeignKey('Asset', on_delete=models.CASCADE, blank=False)
history = HistoricalRecords()

# Return '<Asset> - <Value>' for Queries
def __str__(self):
return str(self.asset) + "-" + str(self.field)

class Asset(models.Model):
id = models.AutoField(primary_key=True)
asset_type = models.ForeignKey('AssetType', on_delete=models.CASCADE, verbose_name='Type')
asset_name = models.CharField('Name', max_length=100)
asset_tag_no = models.CharField('Tag Number', max_length=20, blank=True, null=True)
asset_manufacturer = models.ForeignKey('AssetManufacturer', on_delete=models.SET_NULL, null=True, blank=True)
asset_storage_location = models.ForeignKey('self', on_delete=models.SET_NULL, null=True, blank=True)
asset_list_price = models.PositiveSmallIntegerField('List Price', blank=True, null=True)
asset_needs_pat = models.BooleanField('Needs Electrical Test', null=True)
asset_fields = models.ManyToManyField('AssetField', blank=True, editable=False)
history = HistoricalRecords()

# Return Asset name for queries
def __str__(self):
return self.asset_name

我在 Asset 类下添加了一个保存后处理程序

    @receiver(post_save, sender=Asset)
def my_handler(sender, **kwargs):
t = Asset.asset_type
f = t.type_field.all()
for i in range(1,f.count()+1):
Asset.asset_fields.add(f[i-1:i])

这应该添加与 Assets 的 AssetType 相关的 AssetFields 记录。当我在 django shell 中运行以下命令时,我能够成功将关系添加到 Asset ManyToMany 字段 asset_fields

>>> a = Asset.objects.first()
>>> t = a.asset_type
>>> f = t.type_field.all()
>>> for i in range(1, f.count()+1):
... a.asset_fields.add(f[i-1:i][0])

但是,当我通过管理页面使用与 shell 中使用的类型 t 相同的类型保存 Assets 时,我收到错误:

    AttributeError at /admin/assets/asset/add/
'ForwardManyToOneDescriptor' object has no attribute 'type_field'

我不确定这个错误是从哪里来的,因为相同的函数在 shell 中运行没有任何问题,除非我可能正在处理 @reciever 错误?有什么想法吗?

最佳答案

但是您在 View 中执行的操作与在 shell 中执行的操作不同。在 shell 中,您可以访问特定 Asset 实例上的 asset_type。在 View 中,您可以在本身上调用它。这没有道理;与 shell 版本一样,您需要查询或创建一个实例,然后您可以访问其 asset_type - 并调用 asset_fields.add()

我怀疑,由于这是 Assets 上的信号处理程序,您实际上想使用正在保存的实例。在这种情况下:

def my_handler(sender, instance, **kwargs):
t = instance.asset_type
f = t.type_field.all()

我也无法理解你的循环在那里做什么。我怀疑你的意思是:

    for type in t.type_field.all()
instance.asset_fields.add(t)

关于python - Django 属性错误 : 'ForwardManyToOneDescriptor' object has no attribute <field>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55443134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com