يمكنني استخدام قاعدة البيانات عرض نموذجا في جانغو?

StackOverflow https://stackoverflow.com/questions/507795

سؤال

أود أن استخدام إطلالة لقد خلق في قاعدة بيانات كمصدر بلدي جانغو-عرض.

هل هذا ممكن من دون استخدام مخصص sql ؟

******13/02/09 التحديث***********

مثل العديد من الإجابات تشير يمكنك جعل الخاص بك عرض في قاعدة البيانات ومن ثم استخدامها داخل API من خلال تحديد ذلك في models.py.

تحذير على الرغم من:

  • manage.py syncdb لن تعمل بعد الآن
  • رأي في حاجة إلى نفس الشيء في بداية اسم كل النماذج الأخرى(الجداول) هـ.ز إذا كان التطبيق الخاص بك يسمى "شيء" ثم طريقة العرض الخاصة بك سوف تحتاج إلى أن يسمى thing_$viewname
هل كانت مفيدة؟

المحلول

منذ جانغو 1.1 يمكنك استخدام خيارات.تمكنت من أجل ذلك.

للإصدارات القديمة, يمكنك بسهولة تحديد نموذج فئة لعرض واستخدامه مثل وجهات النظر الأخرى.لقد اختبرت ذلك باستخدام Sqlite على أساس التطبيق ويبدو أن تعمل بشكل جيد.فقط تأكد من إضافة مفتاح أساسي حقل إذا عرض في "مفتاح أساسي" عمود لا يدعى 'id' و تحديد عرض اسم في خيارات ميتا إذا نظر لا يسمى 'app_classname'.

المشكلة الوحيدة هي أن "syncdb" الأمر سيتم رفع استثناء منذ جانغو محاولة إنشاء الجدول.يمكنك منع هذا عن طريق تحديد عرض نماذج منفصلة الثعبان ملف مختلف models.py.هذه الطريقة ، جانغو لن نراهم عندما introspecting models.py لتحديد نماذج لإنشاء التطبيق و لذلك لن محاولة إنشاء الجدول.

نصائح أخرى

مجرد تحديث لأولئك الذين سوف تواجه هذا السؤال (من جوجل أو أي شيء آخر)...

حاليا جانغو لديه بسيطة "الطريق الصحيح" أن تحديد نموذج دون إدارة جداول قاعدة البيانات:

خيارات.تمكنت

الافتراضي True, بمعنى جانغو سيتم إنشاء قاعدة البيانات المناسبة في الجداول syncdb وإزالتها كجزء من reset إدارة الأوامر.هذا هو جانغو يدير جداول قاعدة البيانات' دورات الحياة.

إذا False, لا قاعدة البيانات إنشاء جدول أو حذف العمليات سيتم تنفيذ هذا النموذج.وهذا مفيد إذا كان النموذج يمثل القائمة جدول أو عرض قاعدة البيانات التي تم إنشاؤها من قبل بعض وسائل أخرى.هذا هو فقط الفرق عندما managed هو False.جميع جوانب أخرى من نموذج التعامل مع بالضبط نفس كما هو معتاد.

أنا فقط تنفيذ نموذج باستخدام طريقة عرض مع بوستجرس 9.4 و جانغو 1.8.

أنا خلقت مخصص الهجرة دروس مثل هذا:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations


class Migration(migrations.Migration):

    dependencies = [
        ('myapp', '0002_previousdependency'),
    ]

    sql = """
    create VIEW myapp_myview as
     select your view here
    """

    operations = [
        migrations.RunSQL("drop view if exists myapp_myview;"),
        migrations.RunSQL(sql)
    ]

كتبت النموذج كما كنت عادة.يعمل لأغراض بلدي.

ملاحظة- عندما ركضت makemigrations جديد ملف الترحيل تم إنشاء نموذج ، وهو ما المحذوفة يدويا.

الكشف الكامل - من وجهة نظري هو قراءة فقط لأن أنا باستخدام عرض مشتقة من jsonb نوع البيانات و لم يكتب على التحديث بدلا القاعدة.

لقد فعلنا هذا على نطاق واسع جدا في التطبيقات مع MySQL للعمل على قاعدة بيانات واحدة قيود جانغو.التطبيق لديه اثنين من قواعد البيانات الذين يعيشون في واحدة الخلية سبيل المثال.يمكننا تحقيق قاعدة البيانات عبر النموذج ينضم إلى هذا الطريق طالما أننا قد خلقت وجهات النظر لكل جدول في "التيار" قاعدة البيانات الخاصة بنا.

بقدر إدراج/التحديثات في الآراء تذهب مع حالات الاستخدام ، وهو رأي هو في الأساس "select * from [db.الجدول];".وبعبارة أخرى, نحن لا نفعل أي مجمع ينضم أو التصفية حتى إدراج/التحديثات الزناد من حفظ() تعمل على ما يرام.إذا كان لديك حالة استخدام يتطلب المعقدة مثل ينضم أو تصفية واسعة ، وأظن أنك لن يكون لديك أي مشاكل بالنسبة للقراءة فقط السيناريوهات ، ولكن قد واجهت إدراج/تحديث القضايا.أعتقد أن هناك بعض القيود الأساسية في الخلية التي تمنعك من تحديث في الآراء التي عبر جداول معقدة المرشحات ، إلخ.

على أي حال, قد تختلف الأميال الخاص بك إذا كنت تستخدم RDBMS أخرى من الخلية ، ولكن جانغو لا يهتم حقا إذا به يجلس على رأس المادية الجدول أو طريقة العرض.انها سوف تكون RDBMS أن يحدد ما إذا كان يعمل في الواقع كما كنت تتوقع.السابقة المعلق لاحظ أن رمي syncdb من النافذة ، على الرغم من أننا عملت بنجاح مع ما بعد syncdb إشارة إلى أن قطرات المادية الجدول إنشاؤه من قبل جانغو و يعمل لدينا "إنشاء عرض... الأمر".ومع ذلك ، فإن ما بعد syncdb إشارة قليلا الباطنية في الطريقة التي يحصل أثار لذا التحذير emptor هناك أيضا.

تحرير:وبطبيعة الحال من قبل "بعد syncdb إشارة" أعني "ما بعد syncdb المستمع"

من جانغو الوثائق الرسمية, يمكنك أن تتصل عرض مثل هذا:

#import library
from django.db import connection

#Create the cursor
cursor = connection.cursor()

#Write the SQL code
sql_string = 'SELECT * FROM myview'

#Execute the SQL
cursor.execute(sql_string)
result = cursor.fetchall()

آمل أن يساعد ;-)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top