具有多个类的Django模型

时间:2012-08-14 06:27:22

标签: python mysql django

我正在编写我的第一个Django应用程序,并希望创建一个包含多个不同类的标头模型。

代码:

class Meta(models.Model):
    meta_keywords = models.CharField(max_length=500) 
    meta_description = models.CharField(max_length=500)
    page_title = models.CharField(max_length=200)
    page_id = models.CharField(max_length=100)

class Javascript(models.Model):
    page_id = models.CharField(max_length=100)
    status = models.BooleanField()

class Javascript_resources(models.Model):
    page_id = models.CharField(max_length=100)
    status = models.BooleanField() #whether or not these are live/local

class Style_sheets(models.Model):
    page_id = models.CharField(max_length = 100)
    resource_type = models.CharField(max_length = 100)
    status = models.BooleanField()

我怎样才能在模型中创建一个函数来返回一个具有正确元对象,style_sheets对象,javascript对象等的对象。

4 个答案:

答案 0 :(得分:2)

如果有不同的模型,您无法在任何模型中创建此类方法,因为一个模型不了解其他模型。这是一个包装。

我认为制作对象的字母组合是正常的,你拥有的字段越多,具有相同的名称(' status')。

from django.http import HttpResponse
from django.template import RequestContext
...
def your_view( request ):
    t = loader.get_template( your_template )
    if 'page_id' in request.REQUEST:
        page_id = request.REQUEST[ 'page_id' ]       

        all_objs = { 'metas': Meta.objects.filter( page_id = page_id ),
                        'javascripts': Javascript.objects.filter( page_id = page_id ),
                        'javascript_resources': JavascriptResources.objects.filter( page_id = page_id ),
                        'style_sheets': StyleSheets.objects.filter( page_id = page_id ) }
        c = RequestContext( request, all_objs )
    else:
        c = RequestContext( request )

    return HttpResponse( t.render(c), content_type = 'text/html' )

然后在模板中你可以迭代它们(javascripts的一个例子):

{% for javascript in javascripts %}
    {% if javascript.status %}
        ...
    {% endif %}
{% endfor %}

实现的详细信息取决于是否存在具有自定义page_id的对象。也许你应该检查一下。

答案 1 :(得分:1)

由于您的所有模型似乎都引用了某个网页,因此您应该创建一个Page模型并将page_ids替换为ForeignKeys

class Page(models.Model):
    title = models.CharField()


class Meta(models.Model):
    meta_keywords = models.CharField(max_length=500) 
    meta_description = models.CharField(max_length=500)
    page_title = models.CharField(max_length=200)
    page = models.ForeignKey(Page)

尽管如此,我认为将页面的所有部分放在单独的模型中(=数据库中的表格)在某种程度上是矫枉过正的,尽管我并不完全了解您的用例。另一种可能性是使用多重继承将这些模型组合在一起。

答案 2 :(得分:0)

在Django中,您可以在models.py中定义数据库结构,并在views.py中保留大多数函数。您似乎正在尝试创建一个函数,根据某些参数获取记录。为此,在views.py中定义一个函数,该函数从表中获取相关记录并将其返回给您。

我建议你浏览这里的Django教程,特别是第3页。

https://docs.djangoproject.com/en/dev/intro/tutorial03/

答案 3 :(得分:0)

在我的情况下,针对此问题的最佳解决方案最终看起来像这样:

我喜欢将相关文件存储在数据库中,原因有几个。在我的设置文件中,我有一个状态设置,允许我控制整个网站的标题。我有某些文件只有实时/本地,有些文件是资源。例如,我在本地使用较少的css但是为实时站点编译它。当我更改此变量时,这会通过查询数据库以获取正确的文件来自动更改我的标头。我还检查文件是否存在,因为当css / js文件无法正确加载时调试会非常令人沮丧!它有点矫枉过正,但会用于很多网站。

from models import *

来自django.conf导入设置 从os import path#也可以写成import os.path

class Resources(object):

status = True
page_id = ""


# META INFORMATION
meta_keywords = ""
meta_description = ""
page_title = ""
favicon = ""

# RESOURCES
javascript_resources = []
javascript_files = []
style_sheets = []

def __init__(self, page_id = "home"):
    self.page_id = page_id.lower()
    self.get_status()
    self.get_meta()
    self.get_javascript()
    self.get_style_sheets()

def get_status(self):
    status = settings.SITE_STATUS

    if(status != "live"):
        self.status = False
    else:
        self.status = True


def get_meta(self):
    current = Meta.objects.get(page_id = self.page_id)
    self.meta_keywords = current.meta_keywords
    self.meta_description = current.meta_description
    self.page_title = current.page_title
    self.favicon = current.favicon

# this function will set all of the proper javascript lists and validate all files!
def get_javascript(self):


    javascript_list = Javascript.objects.filter(Q(page_id = "all") | Q(page_id = self.page_id)).filter(status = self.status)
    javascript_resources_list = Javascript_resources.objects.filter(Q(page_id = "all") | Q(page_id = self.page_id)).filter(status = self.status)

    #now evaulate the javascript
    if len(javascript_list) > 0:
        for resource in javascript_list:
            file_name = resource.url

            if self.exists(file_name):
                self.javascript_files.append(file_name)

    if len(javascript_resources_list) > 0:
        for resource in javascript_resources_list:
            file_name = resource.url

            if self.exists(file_name):
                self.javascript_resources.append(file_name)


def get_style_sheets(self):

    style_sheet_list = Style_sheets.objects.filter(Q(page_id = "all") | Q(page_id = self.page_id)).filter(status = self.status)


    if len(style_sheet_list) > 0:
        for resource in style_sheet_list:
            file_name = resource.url
            file_type = resource.file_type

            if self.exists(file_name):
                style_sheet = []
                style_sheet.append(file_type)
                style_sheet.append(file_name)

                self.style_sheets.append(style_sheet)

def exists(self, file_name):

    url = settings.STATIC_URL + file_name

    status = False

    if  path.exists(url):
        status = True

    return status