Django中模型类的定义

Posted 映辉博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django中模型类的定义相关的知识,希望对你有一定的参考价值。

1、模型文件以及继承的类

 

2、ORM对应关系

 

一个class类,对应数据库一个表
一个class属性,对应一个字段
一个实例对象,对应一条数据记录

 

 

3、主键

可以自己定义主键列,如果自己不定义主键的话,会自动生成ID列并作为主键。

 

4、属性命名规则

 

属性名 = models.字段类型(约束选项, verbose_name="注释")

 

5、字段类型

 

6、约束

 

7、外键

在设置外键时,需要通过on_delete选项指明主表删除数据时,对于外键引用表数据如何处理,在django.db.models中包含了可选常量:

 

8、补充

 

 

 

 

Django 识别基于类的视图并形成多个模型

【中文标题】Django 识别基于类的视图并形成多个模型【英文标题】:Django Identifying Class Based View and Form Multiple Models 【发布时间】:2019-07-31 09:08:00 【问题描述】:

我正在进行我的第二个 Django 项目。在我的第一个项目中,我使用了所有通用视图,只有最基本的表单使用 UpdateView 直接绑定到自定义用户模型。

在这个项目中,我正在尝试实现用户配置文件功能。我的自定义用户模型有一些额外的虚拟字段,以便我可以操作数据。我将其称为CustomUser 模型。我还有一个包含地址的UserAddress 模型,因为用户可以拥有多个地址。我已经尝试寻找其他问题,并且我得到了类似的问题,但总是缺少一些东西:

Django class based views - UpdateView with two model forms - one submit

Using Multiple ModelForms with Class-Based Views

Multiple Models in a single django ModelForm?

Django: multiple models in one template using forms

过去一两天我一直在寻找“Django 方式”来做我想做的事情,但没有运气。我最初的想法是我可以使用一个模板,将两个 ModelForms 封装在一个 <form> 标签中。然后视图将处理每个表单并更新CustomUser 模型并创建或更新UserAddress 模型。我已经想出了如何使用基础View CBV 将功能组合在一起,但我怀疑我正在复制很多我可能已经在 Django 中找到的功能。这是我的观点,我手动处理表单实例化,并提供context

class UserDetailsView(View):

    def get(self, request):
        user = request.user
        user_basic = CustomUser.objects.get(pk=user.pk)
        basic_form = UserBasicForm(instance=user_basic)

        user_address = UserAddress.objects.get(user=user.pk)   
        billing_address_form = UserAddressForm(instance = user_address)

        context = 'basic_form':basic_form,'billing_address_form':billing_address_form

        return render(request, 'mainapp/profile.html', context)

此时我的post 是一样的,因为我还没有进行实际的验证和保存。

class UserBasicForm(forms.ModelForm):

    class Meta(forms.ModelForm):
        model = CustomUser
        fields = (
            'username',
            'first_name',
            'last_name',
            )
        labels = 
            'username':'Username',
            'first_name':'First Name',
            'last_name':'Last Name',
            

class UserAddressForm(forms.ModelForm):

    class Meta(forms.ModelForm):
        model = UserAddress
        fields = (
            'description',
            'addressee',
            'company',
            'address_1',
            'address_2',
            'city',
            'prov_state',
            'post_zip',
            'country',
            )
        labels = 
            'description':'Address Description',
            'addressee':'Addressee',
            'company':'Company Name',
            'address_1':'Address',
            'address_2':'Address 2',
            'city':'City',
            'prov_state':'Province or State',
            'post_zip':'Postal or Zip Code',
            'country':'Country',
            

class CustomUser(AbstractUser):
    objects = CustomUserManager()

    def __str__(self):
        return self.email

class UserAddress(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE,)

    description = models.CharField(max_length = 256, default='Description')

    addressee = models.CharField(max_length = 256,)
    company = models.CharField(max_length = 256, default='Self')
    address_1 = models.CharField(max_length = 256,)
    address_2 = models.CharField(max_length = 256,)
    city = models.CharField(max_length = 256,)
    prov_state = models.CharField(max_length = 256,)
    post_zip = models.CharField(max_length = 256,)
    country = models.CharField(max_length = 256,)

    def __str__(self):
        return self.description

请放轻松,我会接受所提供的大部分建议。

编辑 在查看了其他一些 SO 问题和 Django 表单示例之后,似乎最终答案可能不是 SO 材料。也就是说,我的观察是,对于 Django 内置 CBV,“最佳”基本视图是您可以最小化或简化您添加的代码的视图。在这种情况下,为我的项目使用 TemplateView 或 FormView 仅取决于我选择重写或覆盖哪些方法,为此,我仍然愿意接受建议。

【问题讨论】:

您是否尝试仅从地址表单类扩展基本表单? 嗯,我不确定我明白你的意思。 ModelForm 和相关方法应该可以很好地工作,因为数据与模型紧密耦合(我认为)。我误解了吗? 视图逻辑是我认为应该存在于 Django 中的......我认为表单和模板取决于项目。 应该。试试这个:django-betterforms.readthedocs.io/en/latest/… 我明白了...我看到了另一个 SO 答案,他们使用复合表单,但我不知道如何使用它来制作视图。当时,我觉得有点像胶带解决方案。 【参考方案1】:

我会做这样的事情 (with betterforms):

class UserCreationMultiForm(MultiModelForm):
    form_classes = 
        'basic': UserBasicForm,
        'address': UserAddressForm,
    


class UserDetailsView(View):
    template = "mainapp/profile.html"
    form_class = UserCreationMultiForm
    success_url = reverse_lazy('home')

    def form_valid(self, form):
        # Save the user first, because the profile needs a user before it
        # can be saved.
        user = form['basic'].save()
        address = form['address'].save(commit=False)
        address.user = user
        address.save()
        return redirect(self.get_success_url())

然后将模板中的表单重命名为form.basicform.address

【讨论】:

所以这将使用通用的View,因为它包含来自多个模型的数据? 在查看了更多 SO 问题和答案后,我意识到我犯了一些愚蠢的错误,这些错误并没有让事情变得更容易。我最初使用 Django 内置视图的想法与其他解决方案相匹配,其中在 UpdateView 中使用主要模型和表单,并且手动管理其他数据。目前,我希望避免使用多种形式的解决方案,以降低依赖关系。您的方法使用了通用的view,这几乎就是我在之前的项目中所做的。我暂时将其保持打开状态以供进一步输入。

以上是关于Django中模型类的定义的主要内容,如果未能解决你的问题,请参考以下文章

带有来自模型的自定义验证消息的 Django 1.5 基于类的视图

7.Django模型类的定义和管理

Django进阶Model篇002 - 模型类的定义

django(python)的模型字段类的实例化问题,新手请教。

Django中模型

如何根据 Django 中当前基于类的通用视图模型向模板加载器添加路径