首页 > 解决方案 > NameError:名称“contact_value”未在 serializers.py 中定义

问题描述

我遵循了关于 Django REST 框架的教程,现在我正在尝试将我学到的知识应用到我的数据库中。堆栈跟踪的最后一部分是:

  ...
  File "C:\Python\Python39\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
  File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 790, in exec_module
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "C:\Users\jmr\projects\python\django-ref-impl\django_ref_impl\parties\urls.py", line 30, in <module>
    from . import views
  File "C:\Users\jmr\projects\python\django-ref-impl\django_ref_impl\parties\views.py", line 49, in <module>
    from .serializers import (
  File "C:\Users\jmr\projects\python\django-ref-impl\django_ref_impl\parties\serializers.py", line 52, in <module>
    class ContactMethodSerializer(serializers.ModelSerializer):
  File "C:\Users\jmr\projects\python\django-ref-impl\django_ref_impl\parties\serializers.py", line 54, in ContactMethodSerializer
    class Meta:
  File "C:\Users\jmr\projects\python\django-ref-impl\django_ref_impl\parties\serializers.py", line 59, in Meta
    contact_value,
NameError: name 'contact_value' is not defined

我的serializer.py的开头是:

from rest_framework import serializers 

from .models import (
    ContactMethod,
    ContactMethodType,
    CountryType,
    GenderType,
    Organisation,
    OrganisationType,
    Party,
    PartyContact,
    PartyContactType,
    PartyIdentifierType,
    PartyRelationship,
    PartyType,
    Person,
    RoleType,
    RoleTypeRelationship,
    )

#
# TABLE: CONTACT_METHOD (COME)
#
class ContactMethodSerializer(serializers.ModelSerializer):

    class Meta:
        # the model for Serializer
        model = ContactMethod
        # field names for serialization
        fields = (
            contact_value,
            effective_period_from,
            effective_period_to,
            extension_number,
            notes,
            id,
            contact_method_type_id,
            created_at,
            created_by,
            updated_at,
            updated_by,
            )
        ...

错误字段contact_value是列表中的第一个。我的models.py定义了contact_value

#
# TABLE: CONTACT_METHOD (COME)
#
class ContactMethod(models.Model):
    # attributes:
    contact_value = models.CharField(db_column = 'CONTACT_VALUE', max_length = 255, null=True, blank=True, verbose_name = 'Contact Value')
    effective_period_from = models.DateTimeField(db_column = 'EFFECTIVE_PERIOD_FROM', null=True, blank=True, verbose_name = 'Effective Period From')
    effective_period_to = models.DateTimeField(db_column = 'EFFECTIVE_PERIOD_TO', null=True, blank=True, verbose_name = 'Effective Period To')
    extension_number = models.CharField(db_column = 'EXTENSION_NUMBER', max_length = 255, null=True, blank=True, verbose_name = 'Extension Number')
    notes = models.TextField(db_column = 'NOTES', max_length = 1000, null=True, blank=True, verbose_name = 'Notes')
    created_at = models.DateTimeField(db_column = 'CREATED_AT', verbose_name = 'Created At', editable = False, auto_now_add=True)
    created_by = models.CharField(db_column = 'CREATED_BY', max_length = 255, verbose_name = 'Created By', editable = False)
    updated_at = models.DateTimeField(db_column = 'UPDATED_AT', verbose_name = 'Updated At', editable = False, auto_now=True)
    updated_by = models.CharField(db_column = 'UPDATED_BY', max_length = 255, verbose_name = 'Updated By', editable = False)

    # primary & foreign keys:
    id = models.BigAutoField(db_column = 'ID', primary_key = True)
    # COME_REF_CMTY_FK: ref CONTACT_METHOD_TYPE 
    contact_method_type_id = models.ForeignKey(ContactMethodTypeLv, on_delete = models.DO_NOTHING, db_column = 'CONTACT_METHOD_TYPE_ID', verbose_name = 'Contact Method Type')

    def __str__(self):
        return f'contact_value={self.contact_value} | effective_period_from={self.effective_period_from} | effective_period_to={self.effective_period_to} | extension_number={self.extension_number} | notes={self.notes} | id={self.id} | contact_method_type_id={self.contact_method_type_id} | created_at={self.created_at} | created_by={self.created_by} | updated_at={self.updated_at} | updated_by={self.updated_by}'

    class Meta:
        #abstract = True
        managed = False
        db_table = 'CONTACT_METHOD'
        verbose_name = 'Contact Method'
        verbose_name_plural = 'Contact Methods'
        ordering = (
            'id',
            )

$ pip list 返回:

Package             Version
------------------- -------
asgiref             3.3.1
cx-Oracle           8.1.0
Django              3.1.4
django-appconf      1.0.4
djangorestframework 3.12.2
Pillow              8.1.0
pip                 20.3.3
pytz                2020.5
setuptools          49.2.1
six                 1.15.0
sqlparse            0.4.1

因此,很难从中理解为什么没有定义contact_value 。我错过了什么?

标签: python-3.xdjango

解决方案


这些字段是按名称指定的,因此是字符串,而不是标识符,因为这些标识符确实不在范围内:

class ContactMethodSerializer(serializers.ModelSerializer):

    class Meta:
        # the model for Serializer
        model = ContactMethod
        # field names for serialization
        fields = (
        #   ↓             ↓ string literal
            'contact_value',
            'effective_period_from',
            'effective_period_to',
            'extension_number',
            'notes',
            'id',
            'contact_method_type_id',
            'created_at',
            'created_by',
            'updated_at',
            'updated_by'
        )

推荐阅读