Getting blank 'data' results

Issue #28 closed
Randy Thompson created an issue

models.py:

class ServerWinPatchResults(models.Model):
    patch_result_id = models.CharField(primary_key=True, max_length=45)
    server = models.ForeignKey('Servers', models.Cascade)
    patch_guid = models.ForeignKey('WinPatches', models.Cascade, db_column='patch_guid')
    downloaded = models.CharField(max_length=5)
    installed = models.CharField(max_length=5)
    date_installed = models.DateTimeField()

urls.py:

from django.conf.urls import url
from backend.views import ProfileView, JobsView, PatchReportView, PatchReportTable


urlpatterns = [
    url(r'^$', ProfileView.as_view(), name='profile'),
    url(r'^jobs', JobsView.as_view(), name='jobs'),
    url(r'^patchreport', PatchReportView.as_view(), name='patchreport'),
    url(r'^prtbl/$', PatchReportTable.as_view(), name='patchreptbl')
]

views.py:

class PatchReportTable(BaseDatatableView):
    model = ServerWinPatchResults

    def get_initial_queryset(self):
        return ServerWinPatchResults.objects.values('server__nodename', 'patch_guid__guid', 'downloaded', 'installed',
                                                    'date_installed')

I am getting blank 'data' returns:

{
    "recordsFiltered": 178,
    "result": "ok",
    "recordsTotal": 178,
    "draw": 0,
    "data": [
        [],
        [],
        [],
        [],
        [],
        [],
        [],
        [],
        [],
        []
    ]
}

I thought it might be the query itself, but even if I change the initial query set to ServerWinPatchResults.objects.all() or ServerWinPatchResults.objects.filter(patch_result_id='16013af7d6-ec9f-4def-ae41-007d211f9fbc') I still get empty results. I have even tried changing the table that is being used to a table without foriegnkeys to see if that is causing the issue to no avail. I see that it is actually reading the query object length since that is the only data being populate so not quite sure what the issue is here.

Comments (6)

  1. Maciej Wisniowski repo owner

    Seems that you've not defined columns attribute for your PatchReportTable class

  2. Randy Thompson reporter

    if I set columns:

    class PatchReportTable(BaseDatatableView):
        model = ServerWinPatchResults
        columns = ['server__nodename', 'patch_guid__guid', 'downloaded', 'installed', 'date_installed']
    
        def get_initial_queryset(self):
            return ServerWinPatchResults.objects.values('server__nodename', 'patch_guid__guid', 'downloaded', 'installed',
                                                        'date_installed')
    

    It fails with an entirely different error:

    {"error": "\nAttributeError\n'dict' object has no attribute 'server__nodename'\n\nDjango Version: 1.10\nPython Executable: /Users/rlthompson/.virtualenvs/venv/bin/python\nPython Version: 3.5.2\nPython Path: ['/Users/rlthompson/PycharmProjects/besoft', '/Users/rlthompson/PycharmProjects/besoft', '/Users/rlthompson/.virtualenvs/venv/lib/python35.zip', '/Users/rlthompson/.virtualenvs/venv/lib/python3.5', '/Users/rlthompson/.virtualenvs/venv/lib/python3.5/plat-darwin', '/Users/rlthompson/.virtualenvs/venv/lib/python3.5/lib-dynload', '/usr/local/Cellar/python3/3.5.2_1/Frameworks/Python.framework/Versions/3.5/lib/python3.5', '/usr/local/Cellar/python3/3.5.2_1/Frameworks/Python.framework/Versions/3.5/lib/python3.5/plat-darwin', '/Users/rlthompson/.virtualenvs/venv/lib/python3.5/site-packages']\nServer time: Wed, 17 Aug 2016 21:49:39 +0000\nInstalled Applications:\n['django.contrib.admin',\n 'django.contrib.auth',\n 'django.contrib.contenttypes',\n 'django.contrib.sessions',\n 'django.contrib.messages',\n 'django.contrib.staticfiles',\n 'django.contrib.sites',\n 'allauth',\n 'allauth.account',\n 'allauth.socialaccount',\n 'frontend.apps.FrontendConfig',\n 'backend.apps.BackendConfig',\n 'tastypie']\nInstalled Middleware:\n['django.middleware.security.SecurityMiddleware',\n 'django.contrib.sessions.middleware.SessionMiddleware',\n 'django.middleware.common.CommonMiddleware',\n 'django.middleware.csrf.CsrfViewMiddleware',\n 'django.contrib.auth.middleware.AuthenticationMiddleware',\n 'django.contrib.messages.middleware.MessageMiddleware',\n 'django.middleware.clickjacking.XFrameOptionsMiddleware']\n\n\nTraceback:  \n\nFile \"/Users/rlthompson/.virtualenvs/venv/lib/python3.5/site-packages/django_datatables_view/base_datatable_view.py\" in render_column\n  52.                 text = getattr(row, column)\n  \n    \n      During handling of the above exception ('dict' object has no attribute 'server__nodename'), another exception occurred:\n    \n  \n\nFile \"/Users/rlthompson/.virtualenvs/venv/lib/python3.5/site-packages/django_datatables_view/base_datatable_view.py\" in get_context_data\n  215.                 data = self.prepare_results(qs)\n\nFile \"/Users/rlthompson/.virtualenvs/venv/lib/python3.5/site-packages/django_datatables_view/base_datatable_view.py\" in prepare_results\n  185.             data.append([self.render_column(item, column) for column in self.get_columns()])\n\nFile \"/Users/rlthompson/.virtualenvs/venv/lib/python3.5/site-packages/django_datatables_view/base_datatable_view.py\" in <listcomp>\n  185.             data.append([self.render_column(item, column) for column in self.get_columns()])\n\nFile \"/Users/rlthompson/.virtualenvs/venv/lib/python3.5/site-packages/django_datatables_view/base_datatable_view.py\" in render_column\n  58.                     obj = getattr(obj, part)\n\nException Type: AttributeError\nException Value: 'dict' object has no attribute 'server__nodename'\nRequest data not supplied\n\nSettings:\nUsing settings module besoft.settings\nABSOLUTE_URL_OVERRIDES = {}\nACCOUNT_AUTHENTICATION_METHOD = 'email'\nACCOUNT_EMAIL_REQUIRED = True\nACCOUNT_EMAIL_VERIFICATION = 'mandatory'\nACCOUNT_LOGOUT_ON_GET = True\nACCOUNT_LOGOUT_REDIRECT_URL = '/'\nACCOUNT_USERNAME_REQUIRED = False\nADMINS = []\nALLOWED_HOSTS = []\nAPPEND_SLASH = True\nAUTHENTICATION_BACKENDS = \nAUTH_PASSWORD_VALIDATORS = '********************'\nAUTH_USER_MODEL = 'auth.User'\nBASE_DIR = '/Users/rlthompson/PycharmProjects/besoft'\nCACHES = {'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'}}\nCACHE_MIDDLEWARE_ALIAS = 'default'\nCACHE_MIDDLEWARE_KEY_PREFIX = '********************'\nCACHE_MIDDLEWARE_SECONDS = 600\nCSRF_COOKIE_AGE = 31449600\nCSRF_COOKIE_DOMAIN = None\nCSRF_COOKIE_HTTPONLY = False\nCSRF_COOKIE_NAME = 'csrftoken'\nCSRF_COOKIE_PATH = '/'\nCSRF_COOKIE_SECURE = False\nCSRF_FAILURE_VIEW = 'django.views.csrf.csrf_failure'\nCSRF_HEADER_NAME = 'HTTP_X_CSRFTOKEN'\nCSRF_TRUSTED_ORIGINS = []\nDATABASES = {'salt': {'TEST': {'COLLATION': None, 'NAME': None, 'CHARSET': None, 'MIRROR': None}, 'PASSWORD': '********************', 'HOST': 'localhost', 'TIME_ZONE': None, 'PORT': '3306', 'OPTIONS': {}, 'ENGINE': 'django.db.backends.mysql', 'ATOMIC_REQUESTS': False, 'USER': 'root', 'NAME': 'salt', 'CONN_MAX_AGE': 0, 'AUTOCOMMIT': True}, 'default': {'TEST': {'COLLATION': None, 'NAME': None, 'CHARSET': None, 'MIRROR': None}, 'PASSWORD': '********************', 'HOST': 'localhost', 'TIME_ZONE': None, 'PORT': '3306', 'OPTIONS': {}, 'ENGINE': 'django.db.backends.mysql', 'ATOMIC_REQUESTS': False, 'USER': 'root', 'NAME': 'hive', 'CONN_MAX_AGE': 0, 'AUTOCOMMIT': True}}\nDATABASE_ROUTERS = ['backend.routers.BackendRouter']\nDATA_UPLOAD_MAX_MEMORY_SIZE = 2621440\nDATA_UPLOAD_MAX_NUMBER_FIELDS = 1000\nDATETIME_FORMAT = 'N j, Y, P'\nDATETIME_INPUT_FORMATS = ['%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M:%S.%f', '%Y-%m-%d %H:%M', '%Y-%m-%d', '%m/%d/%Y %H:%M:%S', '%m/%d/%Y %H:%M:%S.%f', '%m/%d/%Y %H:%M', '%m/%d/%Y', '%m/%d/%y %H:%M:%S', '%m/%d/%y %H:%M:%S.%f', '%m/%d/%y %H:%M', '%m/%d/%y']\nDATE_FORMAT = 'N j, Y'\nDATE_INPUT_FORMATS = ['%Y-%m-%d', '%m/%d/%Y', '%m/%d/%y', '%b %d %Y', '%b %d, %Y', '%d %b %Y', '%d %b, %Y', '%B %d %Y', '%B %d, %Y', '%d %B %Y', '%d %B, %Y']\nDEBUG = True\nDEBUG_PROPAGATE_EXCEPTIONS = False\nDECIMAL_SEPARATOR = '.'\nDEFAULT_CHARSET = 'utf-8'\nDEFAULT_CONTENT_TYPE = 'text/html'\nDEFAULT_EXCEPTION_REPORTER_FILTER = 'django.views.debug.SafeExceptionReporterFilter'\nDEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'\nDEFAULT_FROM_EMAIL = 'webmaster@localhost'\nDEFAULT_INDEX_TABLESPACE = ''\nDEFAULT_TABLESPACE = ''\nDISALLOWED_USER_AGENTS = []\nEMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'\nEMAIL_HOST = 'localhost'\nEMAIL_HOST_PASSWORD = '********************'\nEMAIL_HOST_USER = ''\nEMAIL_PORT = 25\nEMAIL_SSL_CERTFILE = None\nEMAIL_SSL_KEYFILE = '********************'\nEMAIL_SUBJECT_PREFIX = '[Django] '\nEMAIL_TIMEOUT = None\nEMAIL_USE_SSL = False\nEMAIL_USE_TLS = False\nFILE_CHARSET = 'utf-8'\nFILE_UPLOAD_DIRECTORY_PERMISSIONS = None\nFILE_UPLOAD_HANDLERS = ['django.core.files.uploadhandler.MemoryFileUploadHandler', 'django.core.files.uploadhandler.TemporaryFileUploadHandler']\nFILE_UPLOAD_MAX_MEMORY_SIZE = 2621440\nFILE_UPLOAD_PERMISSIONS = None\nFILE_UPLOAD_TEMP_DIR = None\nFIRST_DAY_OF_WEEK = 0\nFIXTURE_DIRS = []\nFORCE_SCRIPT_NAME = None\nFORMAT_MODULE_PATH = None\nIGNORABLE_404_URLS = []\nINSTALLED_APPS = ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.sites', 'allauth', 'allauth.account', 'allauth.socialaccount', 'frontend.apps.FrontendConfig', 'backend.apps.BackendConfig', 'tastypie']\nINTERNAL_IPS = []\nLANGUAGES = [('af', 'Afrikaans'), ('ar', 'Arabic'), ('ast', 'Asturian'), ('az', 'Azerbaijani'), ('bg', 'Bulgarian'), ('be', 'Belarusian'), ('bn', 'Bengali'), ('br', 'Breton'), ('bs', 'Bosnian'), ('ca', 'Catalan'), ('cs', 'Czech'), ('cy', 'Welsh'), ('da', 'Danish'), ('de', 'German'), ('dsb', 'Lower Sorbian'), ('el', 'Greek'), ('en', 'English'), ('en-au', 'Australian English'), ('en-gb', 'British English'), ('eo', 'Esperanto'), ('es', 'Spanish'), ('es-ar', 'Argentinian Spanish'), ('es-co', 'Colombian Spanish'), ('es-mx', 'Mexican Spanish'), ('es-ni', 'Nicaraguan Spanish'), ('es-ve', 'Venezuelan Spanish'), ('et', 'Estonian'), ('eu', 'Basque'), ('fa', 'Persian'), ('fi', 'Finnish'), ('fr', 'French'), ('fy', 'Frisian'), ('ga', 'Irish'), ('gd', 'Scottish Gaelic'), ('gl', 'Galician'), ('he', 'Hebrew'), ('hi', 'Hindi'), ('hr', 'Croatian'), ('hsb', 'Upper Sorbian'), ('hu', 'Hungarian'), ('ia', 'Interlingua'), ('id', 'Indonesian'), ('io', 'Ido'), ('is', 'Icelandic'), ('it', 'Italian'), ('ja', 'Japanese'), ('ka', 'Georgian'), ('kk', 'Kazakh'), ('km', 'Khmer'), ('kn', 'Kannada'), ('ko', 'Korean'), ('lb', 'Luxembourgish'), ('lt', 'Lithuanian'), ('lv', 'Latvian'), ('mk', 'Macedonian'), ('ml', 'Malayalam'), ('mn', 'Mongolian'), ('mr', 'Marathi'), ('my', 'Burmese'), ('nb', 'Norwegian Bokm\u00e5l'), ('ne', 'Nepali'), ('nl', 'Dutch'), ('nn', 'Norwegian Nynorsk'), ('os', 'Ossetic'), ('pa', 'Punjabi'), ('pl', 'Polish'), ('pt', 'Portuguese'), ('pt-br', 'Brazilian Portuguese'), ('ro', 'Romanian'), ('ru', 'Russian'), ('sk', 'Slovak'), ('sl', 'Slovenian'), ('sq', 'Albanian'), ('sr', 'Serbian'), ('sr-latn', 'Serbian Latin'), ('sv', 'Swedish'), ('sw', 'Swahili'), ('ta', 'Tamil'), ('te', 'Telugu'), ('th', 'Thai'), ('tr', 'Turkish'), ('tt', 'Tatar'), ('udm', 'Udmurt'), ('uk', 'Ukrainian'), ('ur', 'Urdu'), ('vi', 'Vietnamese'), ('zh-hans', 'Simplified Chinese'), ('zh-hant', 'Traditional Chinese')]\nLANGUAGES_BIDI = ['he', 'ar', 'fa', 'ur']\nLANGUAGE_CODE = 'en-us'\nLANGUAGE_COOKIE_AGE = None\nLANGUAGE_COOKIE_DOMAIN = None\nLANGUAGE_COOKIE_NAME = 'django_language'\nLANGUAGE_COOKIE_PATH = '/'\nLOCALE_PATHS = []\nLOGGING = {}\nLOGGING_CONFIG = 'logging.config.dictConfig'\nLOGIN_REDIRECT_URL = '/accounts/profile/'\nLOGIN_URL = '/accounts/login/'\nLOGOUT_REDIRECT_URL = None\nMANAGERS = []\nMEDIA_ROOT = ''\nMEDIA_URL = ''\nMESSAGE_STORAGE = 'django.contrib.messages.storage.fallback.FallbackStorage'\nMIDDLEWARE = ['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']\nMIDDLEWARE_CLASSES = ['django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware']\nMIGRATION_MODULES = {}\nMONTH_DAY_FORMAT = 'F j'\nNUMBER_GROUPING = 0\nPASSWORD_HASHERS = '********************'\nPASSWORD_RESET_TIMEOUT_DAYS = '********************'\nPREPEND_WWW = False\nROOT_URLCONF = 'besoft.urls'\nSECRET_KEY = '********************'\nSECURE_BROWSER_XSS_FILTER = False\nSECURE_CONTENT_TYPE_NOSNIFF = False\nSECURE_HSTS_INCLUDE_SUBDOMAINS = False\nSECURE_HSTS_SECONDS = 0\nSECURE_PROXY_SSL_HEADER = None\nSECURE_REDIRECT_EXEMPT = []\nSECURE_SSL_HOST = None\nSECURE_SSL_REDIRECT = False\nSERVER_EMAIL = 'root@localhost'\nSESSION_CACHE_ALIAS = 'default'\nSESSION_COOKIE_AGE = 1209600\nSESSION_COOKIE_DOMAIN = None\nSESSION_COOKIE_HTTPONLY = True\nSESSION_COOKIE_NAME = 'sessionid'\nSESSION_COOKIE_PATH = '/'\nSESSION_COOKIE_SECURE = False\nSESSION_ENGINE = 'django.contrib.sessions.backends.db'\nSESSION_EXPIRE_AT_BROWSER_CLOSE = False\nSESSION_FILE_PATH = None\nSESSION_SAVE_EVERY_REQUEST = False\nSESSION_SERIALIZER = 'django.contrib.sessions.serializers.JSONSerializer'\nSETTINGS_MODULE = 'besoft.settings'\nSHORT_DATETIME_FORMAT = 'm/d/Y P'\nSHORT_DATE_FORMAT = 'm/d/Y'\nSIGNING_BACKEND = 'django.core.signing.TimestampSigner'\nSILENCED_SYSTEM_CHECKS = []\nSITE_ID = 1\nSTATICFILES_DIRS = ['/Users/rlthompson/PycharmProjects/besoft/static']\nSTATICFILES_FINDERS = ['django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder']\nSTATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'\nSTATIC_ROOT = None\nSTATIC_URL = '/static/'\nTASTYPIE_DEFAULT_FORMATS = ['json']\nTEMPLATES = [{'DIRS': ['/Users/rlthompson/PycharmProjects/besoft/templates'], 'OPTIONS': {'context_processors': ['django.contrib.auth.context_processors.auth', 'django.template.context_processors.debug', 'django.template.context_processors.i18n', 'django.template.context_processors.media', 'django.template.context_processors.static', 'django.template.context_processors.tz', 'django.contrib.messages.context_processors.messages', 'django.template.context_processors.request']}, 'APP_DIRS': True, 'BACKEND': 'django.template.backends.django.DjangoTemplates'}]\nTEST_NON_SERIALIZED_APPS = []\nTEST_RUNNER = 'django.test.runner.DiscoverRunner'\nTHOUSAND_SEPARATOR = ','\nTIME_FORMAT = 'P'\nTIME_INPUT_FORMATS = ['%H:%M:%S', '%H:%M:%S.%f', '%H:%M']\nTIME_ZONE = 'UTC'\nUSE_ETAGS = False\nUSE_I18N = True\nUSE_L10N = True\nUSE_THOUSAND_SEPARATOR = False\nUSE_TZ = True\nUSE_X_FORWARDED_HOST = False\nUSE_X_FORWARDED_PORT = False\nWSGI_APPLICATION = 'besoft.wsgi.application'\nX_FRAME_OPTIONS = 'SAMEORIGIN'\nYEAR_MONTH_FORMAT = 'F Y'\n\n\nYou're seeing this error because you have DEBUG = True in your\nDjango settings file. Change that to False, and Django will\ndisplay a standard page generated by the handler for this status code.\n\n", "recordsFiltered": 0, "recordsTotal": 0, "data": [], "draw": 0, "result": "ok"}
    
  3. Randy Thompson reporter

    Great suggestion. I also was calling the relation incorrectly as well. Here is what I did to fix it:

    class PatchReportTable(BaseDatatableView):
        model = ServerWinPatchResults
        columns = ['server.nodename', 'patch_guid.guid', 'downloaded', 'installed', 'date_installed']
        order_columns = ['server.nodename', 'patch_guid.guid', 'downloaded', 'installed', 'date_installed']
    
        def get_initial_queryset(self):
            return ServerWinPatchResults.objects.all()
    
  4. Log in to comment