标签: django-inheritance

在Django中 - 模型继承 - 它是否允许您覆盖父模型的属性?

我希望这样做:

class Place(models.Model):
   name = models.CharField(max_length=20)
   rating = models.DecimalField()

class LongNamedRestaurant(Place):  # Subclassing `Place`.
   name = models.CharField(max_length=255)  # Notice, I'm overriding `Place.name` to give it a longer length.
   food_type = models.CharField(max_length=25)
Run Code Online (Sandbox Code Playgroud)

这是我想要使用的版本(虽然我对任何建议持开放态度):http: //docs.djangoproject.com/en/dev/topics/db/models/#id7

这是Django支持吗?如果没有,有没有办法取得类似的结果?

python django django-inheritance

87
推荐指数
8
解决办法
5万
查看次数

Django模板:通过扩展模板覆盖包含子模板的块

我想知道是否有人知道如何处理以下古怪的模板结构:

### base.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">

<head>
  <title> {% block title %} Title of the page {% endblock %} </title>
</head>

<body>
  <header>
    {% block header %}
      {% include "base/header.html" %}
    {% endblock header %}
  </header>
  {% block content %}{% endblock %}
</body>

</html>
Run Code Online (Sandbox Code Playgroud)
### base/header.html
<div id="menu-bar">
  {% block nav %}
    {% include "base/nav.html" %}
  {% endblock %}
</div>
Run Code Online (Sandbox Code Playgroud)
### base/nav.html
<nav id="menu">
  <ul>
    <li>
      <a href="/profile/">My Profile</a>
    </li>
    <li>
      <a href="/favs/">My Favorites</a>
    </li> …
Run Code Online (Sandbox Code Playgroud)

python django django-templates django-inheritance

33
推荐指数
3
解决办法
2万
查看次数

在基类查询后确定Django模型实例类型

有没有办法确定Django数据库对象的"真正"类是什么,从基类的查询返回后?

例如,如果我有这些模型......

class Animal(models.Model):
    name= models.CharField(max_length=128)

class Person(Animal):
    pants_size = models.IntegerField(null=True)

class Dog(Animal):
    panting_rate = models.IntegerField(null=True)
Run Code Online (Sandbox Code Playgroud)

并创建这些实例......

Person(name='Dave').save()
Dog(name='Mr. Rufflesworth').save()
Run Code Online (Sandbox Code Playgroud)

如果我进行类似的查询Animal.objects.all(),我最终得到两个Animal实例,而不是实例Person和实例Dog.有没有办法确定哪个实例属于哪种类型?


仅供参考:我已经尝试过这样做了......

isinstance(Animal.objects.get(name='Dave'),Person) # <-- Returns false!
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用.

django inheritance django-models django-inheritance

11
推荐指数
3
解决办法
9506
查看次数

Django 代理模型的继承和多态性

我正在开发一个我没有启动的 Django 项目,并且面临继承问题。
我有一个大模型(在示例中简化)称为MyModel它应该代表不同类型的项目。

的所有实例对象MyModel都应具有相同的字段,但方法行为根据项目类型而有很大差异。

到目前为止,它是使用一个MyModel名为 的单个字段来设计的item_type
然后 MyModel 中定义的方法检查该字段并使用多个 if 执行不同的逻辑:

def example_method(self):
    if self.item_type == TYPE_A:
        do_this()
    if self.item_type == TYPE_B1:
        do_that()
Run Code Online (Sandbox Code Playgroud)

更重要的是,某些子类型有许多共同点,因此可以说子类型BC代表第一级继承。然后这些类型有子类型,例如B1, B2, C1, C2(在下面的示例代码中更好地解释)。

我想说这不是执行多态性的最佳方法。

现在我想更改这些模型以使用真正的继承。

由于所有子模型都有相同的字段,我认为多表继承是没有必要的。我正在考虑使用代理模型,因为只有它们的行为应该根据它们的类型而改变。

这是我提出的伪解决方案:

ITEM_TYPE_CHOICES = (
    (TYPE_A, _('Type A')),
    (TYPE_B1, _('Type B1')),
    (TYPE_B2, _('Type B2')),
    (TYPE_C1, _('Type C1')),
    (TYPE_C2, _('Type C2')))


class MyModel(models.Model):
    item_type = models.CharField(max_length=12, choices=ITEM_TYPE_CHOICES)

    def common_thing(self):
        pass …
Run Code Online (Sandbox Code Playgroud)

python django proxy-classes django-models django-inheritance

7
推荐指数
1
解决办法
3943
查看次数

为django中的不同用户类型分别设置'admin'接口

我最近正在尝试创建一个涉及多个级别用户的项目.

(只是缩写和粗略模式的一个例子)

  • 我(超级用户)
    • 客户端(S)
      • 客户(S)
      • 调查收集
        • SurveyUser(s)
          • 受邀者(S)
        • 调查
          • 受邀者(S)(受邀者既调查和用户的孩子)
        • 问题
        • 等等

我理想情况下:

  • www.example.com/client/转到您必须是客户端才能访问的客户端界面
  • www.example.com/customer/转到您必须是客户访问的客户界面

我已经确定使用自定义的Django管理界面可能不可能(或者是吗?).因此,我倾向于为每个级别的用户手动创建"管理"界面,允许他们管理各自的角色.为每个用户提供不同的用户类型和单独的界面的最佳方法是什么?

我喜欢继承用户的方式:http: //scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/

但我不确定如何为不同的用户设置不同的"管理员"区域.

作为一个相关的副问题,我也不确定如何访问自定义属性以及标准用户属性,以及如何在我将使用的ACTUAL管理界面中编辑/保存它们.

我需要针对客户端数据库对"客户端"用户进行身份验证,以检查它们是否为客户端,但也会以某种方式对管理身份验证,用户名,密码等的用户数据库进行身份验证.

我正在从PHP切换到Python/Django所以任何建议都非常感谢帮助我.

谢谢!

django django-models django-admin django-inheritance django-users

5
推荐指数
1
解决办法
4104
查看次数

Django select_related与指定的字段分隔多个一对一关系

我在尝试通过多个OneToOneField关系选择相关时遇到了一个奇怪的错误,例如在目标字段是孙子类的情况下.我希望有人帮助我了解正在发生的事情(或确认这是Django中的一个错误).

插图:

# models.py
from django.db import models

class A(models.Model):
    pass

class B(A):
    pass

class C(B):
    pass
Run Code Online (Sandbox Code Playgroud)

很简单吧?现在我用一个干净的数据库打开Django shell:

>>> C().save()
>>> A.objects.select_related('b__c')
[]
Run Code Online (Sandbox Code Playgroud)

等等,什么?为什么该查询集为空?快速健全检查:

>>> A.objects.select_related('b')[0].b.c
<C: C object>
Run Code Online (Sandbox Code Playgroud)

那么为什么select_related调用不起作用呢?好吧,看这个:

>>> A.objects.select_related('b__c').__iter__().next()
... 
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/opt/webapps/asdf/lib/python2.6/site-packages/django/db/models/query.py", line 107, in _result_iter
    self._fill_cache()
  File "/opt/webapps/asdf/lib/python2.6/site-packages/django/db/models/query.py", line 772, in _fill_cache
    self._result_cache.append(self._iter.next())
  File "/opt/webapps/asdf/lib/python2.6/site-packages/django/db/models/query.py", line 273, in iterator
    for row in compiler.results_iter():
  File "/opt/webapps/asdf/lib/python2.6/site-packages/django/db/models/sql/compiler.py", line 680, in results_iter
    for rows in self.execute_sql(MULTI):
  File …
Run Code Online (Sandbox Code Playgroud)

django django-orm django-queryset django-select-related django-inheritance

5
推荐指数
1
解决办法
1951
查看次数

django呈现一个空白页面

首先,我想承认,我是Django的新手.我尽我所能地学习.我正在通过一本名为"Beginning Django E-Commerce"的书.如果不希望破坏版权,也许你们可以找出我出错的地方.我正在使用Django 1.4.3,我正在使用的书可能是为Django 1编写的,可能是1.1,但是这里有.

我的base.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "XHTML1-s.dtd" >
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>{% block title %}{% if page_title %}{{ page_title }} - {% endif %}
            {{ site_name }}{% endblock %}</title>
    <meta name="keywords" content="{{ meta_keywords }}" />
    <meta name="description" content="{{ meta_description }}" />
</head>
<body>
    {% block site_wrapper %}{% endblock %}
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

我的catalog.html:

{% extends "base.html" %}

{% block site_wrapper %}
<div id="main">
    <a href="#content" class="skip_link">Skip to …
Run Code Online (Sandbox Code Playgroud)

django django-templates django-views django-inheritance

5
推荐指数
1
解决办法
4033
查看次数

保存在 django 中后,对象的 id 为 None

我正在循环遍历对象列表并保存。我需要保存后新生成的 id 或指针 id,但它是 None。

这是我的代码:

for category in category_list:
      saved_category = category.save()
      print saved_category.parentCategory_ptr_id      
      print saved_category.id
Run Code Online (Sandbox Code Playgroud)

这会在例程运行后保存我的对象,但同样不会在这一行给我 id。

这是我的模型:

class ParentCategory(models.Model):
    name = models.CharField(max_length=255)

class Category(ParentCategory):
    description = models.CharField(max_length=255)
Run Code Online (Sandbox Code Playgroud)

类别列表的创建方式如下:

category_list = []
    for row in value_list:
        category = Category(description=row.description)
        category_list.append(category)


 return category_list
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

django django-models django-orm django-inheritance multi-table-inheritance

5
推荐指数
1
解决办法
5960
查看次数

是否可以在django模板中进行多级模板继承?

我有三个html文件:

  • base.html文件
  • page.html中
  • comment.html

page.html中我扩展了base.html.在comment.html中,我扩展了page.html.将comment.html扩展base.html文件的块?

django inheritance django-templates template-inheritance django-inheritance

3
推荐指数
2
解决办法
4147
查看次数

如何在django多表继承中将现有父级与子级关联

我有一个现有的父实体,其中包含许多现有记录:

class Entity(models.Model):
    name = models.CharField('Name', max_length=64, db_index=True) 
Run Code Online (Sandbox Code Playgroud)

我也有使用 django 多表继承扩展的子对象:

class Investor(Entity):
    investor_name = models.CharField(max_length=255)
Run Code Online (Sandbox Code Playgroud)

我想创建可能是现有实体的新 Investor 对象。

我如何将投资者与现有实体关联和创建?

django django-inheritance

3
推荐指数
1
解决办法
1190
查看次数