ValueError: Cannot assign "\<QuerySet [<Area: China>]\>": "Area.parent" must be a "Area" instance.

在研究才Django自关联的过程中,在插入数据时爆出如下错误:

ValueError: Cannot assign "<QuerySet [<Area: China>]>": "Area.parent" must be a "Area" instance.

这是由于把QuerySet当作了instance传进去了。这里需要的拿到QuerySet中的具体实例对象,进行操作。

模型如下:

from django.db import models


class Area(models.Model):
    """
    自关联表。
    自关联模型,就是表中的某一列,关联了这个表中的另外一列。最典型的自关联模型就是地区表。
    省、市、县都在一张表里面。省的pid为null,市的pid为省的id,县的pid为市的id。
    """
    name = models.CharField(max_length=32, verbose_name='行政区名称')
    parent = models.ForeignKey('self', verbose_name='上级行政区', on_delete=models.CASCADE, null=True)

    def __str__(self):
        return self.name

    class Meta:
        db_table = 'office_area'
        verbose_name = '行政区'
        verbose_name_plural = verbose_name

屏幕日志:

(DjangoPro) E:\Project\tutorials>python manage.py shell
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul  8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from polls.models import Area
>>> Area.objects.all()
<QuerySet [<Area: China>]>
>>> Area.objects.create(name='Peking', parent='China')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "E:\virtualenvs\DjangoPro\lib\site-packages\django\db\models\manager.py", line 82, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "E:\virtualenvs\DjangoPro\lib\site-packages\django\db\models\query.py", line 420, in create
    obj = self.model(**kwargs)
  File "E:\virtualenvs\DjangoPro\lib\site-packages\django\db\models\base.py", line 483, in __init__
    _setattr(self, field.name, rel_obj)
  File "E:\virtualenvs\DjangoPro\lib\site-packages\django\db\models\fields\related_descriptors.py", line 211, in __set__
    self.field.remote_field.model._meta.object_name,
ValueError: Cannot assign "'China'": "Area.parent" must be a "Area" instance.
>>> Area.objects.filter(name='China')
>>> a = Area.objects.filter(name='China').first()
>>> a
<Area: China>
>>> Area.objects.create(name='Peking', parent=a)
<Area: Peking>

猜你喜欢

转载自www.cnblogs.com/linga/p/11926060.html