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.basic
和form.address
【讨论】:
所以这将使用通用的View
,因为它包含来自多个模型的数据?
在查看了更多 SO 问题和答案后,我意识到我犯了一些愚蠢的错误,这些错误并没有让事情变得更容易。我最初使用 Django 内置视图的想法与其他解决方案相匹配,其中在 UpdateView
中使用主要模型和表单,并且手动管理其他数据。目前,我希望避免使用多种形式的解决方案,以降低依赖关系。您的方法使用了通用的view
,这几乎就是我在之前的项目中所做的。我暂时将其保持打开状态以供进一步输入。以上是关于Django中模型类的定义的主要内容,如果未能解决你的问题,请参考以下文章
带有来自模型的自定义验证消息的 Django 1.5 基于类的视图