簡體   English   中英

Django模型對象的復雜字符串表示形式(def __str __(self):)

[英]Django complicated string representation of a model object (def __str__(self):)

我一段時間以來一直使用str來處理模型對象的可讀名稱,但是最近我遇到了一些奇怪的崩潰和錯誤,這些錯誤和錯誤似乎與該功能有關。

我有兩個模型SensorAssignmentSnComplex ,它們都與第三個模型RadioSn上的列具有OneToOne關系。 RadioSn是所有序列號的主池。 SnComplex是分配給客戶的序列的列表, SensorAssignment處理分配給特定物理位置的客戶序列的元數據。

重要的是要注意,這是我繼承的舊版數據庫。 有些關系不是理想的恕我直言。

以下是僅具有相關列的模型的簡化版本。

RadioSn

class RadioSn(models.Model):
    sn = models.AutoField(primary_key=True)
    role = models.ForeignKey('Roles', db_column='role', on_delete=models.DO_NOTHING)

    class Meta:
        managed = False
        db_table = 'radio_sn'
        ordering = ['sn']

    def __str__(self):
        return '%s -- %s' % (self.sn, self.role)

錫絡合物

class SnComplex(models.Model):
sn = models.OneToOneField(RadioSn, on_delete=models.DO_NOTHING, db_column='sn', primary_key=True)
complex = models.ForeignKey(Complex, on_delete=models.DO_NOTHING, db_column='complex')

class Meta:
    managed = False
    db_table = 'sn_complex'

傳感器分配

class SensorAssignment(models.Model):
unit = models.ForeignKey('Unit', on_delete=models.DO_NOTHING, db_column='unit')
sn = models.OneToOneField(RadioSn, on_delete=models.DO_NOTHING, db_column='sn')

class Meta:
    managed = False
    db_table = 'sensor_assignment'
    ordering = ['sn']

def __str__(self):
    return self.pk

這是我們開始遇到我的問題的地方。 我使用form.ModelForm來處理SensorAssignment對象的創建和維護。 因此,它為字段sn創建了一個HTML <select> ,其中包含RadioSn對象的選擇, RadioSn對象由上面描述的str格式表示(一個由int主鍵sn和外鍵role組成的字符串[錯誤命名IMHO])。

這完美地工作了(我確實將查詢集限制為視圖上表單初始化時的相關選項,因此它不是模型中的all()對象。)

圖片工作

因此,我應該可以對SnComplex執行相同的SnComplex ,對嗎? 畢竟,每個模型在其各自的sn列上與RadioSn具有相同的關系,並且RadioSn對象的str表示在該模型上完成。

不,這就是我得到的。

錯誤 使其崩潰的行

如果我僅將RadioSn對象表示為self.sn而不是將self.snself.role串聯, self.role它可以在兩種形式上使用,但是如果我將其串聯,則會崩潰SnComplex形式。 所有RadioSn對象都有一個角色值。

有什么想法嗎? 我們有一個RadioSn模型對象的字符串表示形式, RadioSn在模板渲染時使SnComplex ModelForm崩潰,但在其他版本的多個版本的SensorAssignment ModelForm上運行良好。

要求的SnComplex形式:

class AddSensorForm(forms.ModelForm):
    class Meta:
        model = SnComplex
        fields = '__all__'

完整回溯:

Request Method: GET
Request URL: http://127.0.0.1/complex/33/

Django Version: 2.0.4
Python Version: 3.6.1
Installed Applications:
['apps.dashboard',
 'rest_framework',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'apps.dashboard.templatetags.custom_filters',
 'widget_tweaks',
 'phonenumber_field',
 'pygal',
 'django_filters']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']


Template error:
In template C:\git\si-dash\apps\dashboard\templates\header.html, error at line 0
   Roles matching query does not exist.
   1 : {% load static %}
   2 : {% load widget_tweaks %}
   3 : {% load custom_filters %}
   4 : {% csrf_token %}
   5 : 
   6 : <!DOCTYPE html>
   7 : <html lang="en">
   8 : 
   9 : <head>
   10 :     <meta charset="utf-8">


Traceback:

File "C:\Python36\lib\site-packages\django\db\models\fields\related_descriptors.py" in __get__
  158.             rel_obj = self.field.get_cached_value(instance)

File "C:\Python36\lib\site-packages\django\db\models\fields\mixins.py" in get_cached_value
  13.             return instance._state.fields_cache[cache_name]

During handling of the above exception ('role'), another exception occurred:

File "C:\Python36\lib\site-packages\django\core\handlers\exception.py" in inner
  35.             response = get_response(request)

File "C:\Python36\lib\site-packages\django\core\handlers\base.py" in _get_response
  128.                 response = self.process_exception_by_middleware(e, request)

File "C:\Python36\lib\site-packages\django\core\handlers\base.py" in _get_response
  126.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Python36\lib\site-packages\django\contrib\auth\decorators.py" in _wrapped_view
  21.                 return view_func(request, *args, **kwargs)

File "C:\git\si-dash\apps\dashboard\views\complex.py" in complex
  179.     return render(request, 'design/complex.html', passed_data)

File "C:\Python36\lib\site-packages\django\shortcuts.py" in render
  36.     content = loader.render_to_string(template_name, context, request, using=using)

File "C:\Python36\lib\site-packages\django\template\loader.py" in render_to_string
  62.     return template.render(context, request)

File "C:\Python36\lib\site-packages\django\template\backends\django.py" in render
  61.             return self.template.render(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in render
  175.                     return self._render(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in _render
  167.         return self.nodelist.render(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in render
  943.                 bit = node.render_annotated(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in render_annotated
  910.             return self.render(context)

File "C:\Python36\lib\site-packages\django\template\loader_tags.py" in render
  155.             return compiled_parent._render(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in _render
  167.         return self.nodelist.render(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in render
  943.                 bit = node.render_annotated(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in render_annotated
  910.             return self.render(context)

File "C:\Python36\lib\site-packages\django\template\loader_tags.py" in render
  67.                 result = block.nodelist.render(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in render
  943.                 bit = node.render_annotated(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in render_annotated
  910.             return self.render(context)

File "C:\Python36\lib\site-packages\django\template\defaulttags.py" in render
  314.                 return nodelist.render(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in render
  943.                 bit = node.render_annotated(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in render_annotated
  910.             return self.render(context)

File "C:\Python36\lib\site-packages\django\template\defaulttags.py" in render
  211.                     nodelist.append(node.render_annotated(context))

File "C:\Python36\lib\site-packages\django\template\base.py" in render_annotated
  910.             return self.render(context)

File "C:\Python36\lib\site-packages\widget_tweaks\templatetags\widget_tweaks.py" in render
  187.         return str(bounded_field)

File "C:\Python36\lib\site-packages\django\utils\html.py" in <lambda>
  380.     klass.__str__ = lambda self: mark_safe(klass_str(self))

File "C:\Python36\lib\site-packages\django\forms\boundfield.py" in __str__
  36.         return self.as_widget()

File "C:\Python36\lib\site-packages\widget_tweaks\templatetags\widget_tweaks.py" in as_widget
  31.         html = old_as_widget(widget, attrs, only_initial)

File "C:\Python36\lib\site-packages\widget_tweaks\templatetags\widget_tweaks.py" in as_widget
  31.         html = old_as_widget(widget, attrs, only_initial)

File "C:\Python36\lib\site-packages\widget_tweaks\templatetags\widget_tweaks.py" in as_widget
  31.         html = old_as_widget(widget, attrs, only_initial)

File "C:\Python36\lib\site-packages\django\forms\boundfield.py" in as_widget
  118.             **kwargs

File "C:\Python36\lib\site-packages\django\forms\widgets.py" in render
  234.         context = self.get_context(name, value, attrs)

File "C:\Python36\lib\site-packages\django\forms\widgets.py" in get_context
  677.         context = super().get_context(name, value, attrs)

File "C:\Python36\lib\site-packages\django\forms\widgets.py" in get_context
  637.         context['widget']['optgroups'] = self.optgroups(name, context['widget']['value'], attrs)

File "C:\Python36\lib\site-packages\django\forms\widgets.py" in optgroups
  585.         for index, (option_value, option_label) in enumerate(self.choices):

File "C:\Python36\lib\site-packages\django\forms\models.py" in __iter__
  1141.             yield self.choice(obj)

File "C:\Python36\lib\site-packages\django\forms\models.py" in choice
  1147.         return (self.field.prepare_value(obj), self.field.label_from_instance(obj))

File "C:\Python36\lib\site-packages\django\forms\models.py" in label_from_instance
  1213.         return str(obj)

File "C:\git\si-dash\apps\dashboard\models.py" in __str__
  728.         return '%s -- %s' % (self.sn, self.role)

File "C:\Python36\lib\site-packages\django\db\models\fields\related_descriptors.py" in __get__
  164.                 rel_obj = self.get_object(instance)

File "C:\Python36\lib\site-packages\django\db\models\fields\related_descriptors.py" in get_object
  139.         return qs.get(self.field.get_reverse_related_filter(instance))

File "C:\Python36\lib\site-packages\django\db\models\query.py" in get
  403.                 self.model._meta.object_name

Exception Type: DoesNotExist at /complex/33/
Exception Value: Roles matching query does not exist.

我正在審查您遇到的問題,我認為這可能是內部加入錯誤。 我查看了數據庫(非Django管理的數據庫),似乎radio_sn.role未設置為外鍵。

假定有可能與特定傳感器相關聯的“壞”角色。 看起來有一個序列號的舊記錄,該序列號的角色在角色表中不存在,這是聯接錯誤和收到的“無角色”錯誤的根本原因。

我更正了這些記錄,並將研究使radio_sn.role成為角色表的外鍵的步驟。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM