django|django 2.0外键处理
【django|django 2.0外键处理】Django2.0里model外键和一对一的on_delete参数
在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错:
TypeError: __init__() missing 1 required positional argument: 'on_delete'
举例说明:
user=models.OneToOneField(User)
owner=models.ForeignKey(UserProfile)
需要改成:
user=models.OneToOneField(User,on_delete=models.CASCADE)--在老版本这个参数(models.CASCADE)是默认值
owner=models.ForeignKey(UserProfile,on_delete=models.CASCADE)--在老版本这个参数(models.CASCADE)是默认值
参数说明:
on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五个可选择的值
CASCADE:此值设置,是级联删除。
PROTECT:此值设置,是会报完整性错误。
SET_NULL:此值设置,会把外键设置为null,前提是允许为null。
SET_DEFAULT:此值设置,会把设置为外键的默认值。
SET():此值设置,会调用外面的值,可以是一个函数。
一般情况下使用CASCADE就可以了。
下面是官方文档说明:
ForeignKeyaccepts other arguments that define the details of how the relation works.
ForeignKey.on_delete?
When an object referenced by aForeignKeyis deleted, Django will emulate the behavior of the SQL constraint specified by theon_deleteargument. For example, if you have a nullableForeignKeyand you want it to be set null when the referenced object is deleted:
user=models.ForeignKey(User,models.SET_NULL,blank=True,null=True,)
Deprecated since version 1.9:on_deletewill become a required argument in Django 2.0. In older versions it defaults toCASCADE.
The possible values foron_deleteare found indjango.db.models:
CASCADE[source]?
Cascade deletes. Django emulates the behavior of the SQL constraint ON DELETE CASCADE and also deletes the object containing the ForeignKey.
PROTECT[source]?
Prevent deletion of the referenced object by raisingProtectedError, a subclass ofdjango.db.IntegrityError.
SET_NULL[source]?
Set theForeignKeynull;
this is only possible ifnullisTrue.
SET_DEFAULT[source]?
Set theForeignKeyto its default value;
a default for theForeignKeymust be set.
SET()[source]?
Set theForeignKeyto the value passed toSET(), or if a callable is passed in, the result of calling it. In most cases, passing a callable will be necessary to avoid executing queries at the time your models.py is imported:
fromdjango.confimportsettingsfromdjango.contrib.authimportget_user_modelfromdjango.dbimportmodelsdefget_sentinel_user():returnget_user_model().objects.get_or_create(username='deleted')[0]classMyModel(models.Model):user=models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.SET(get_sentinel_user),)
DO_NOTHING[source]?
Take no action. If your database backend enforces referential integrity, this will cause anIntegrityErrorunless you manually add an SQLONDELETEconstraint to the database field.
ForeignKey.limit_choices_to?
Sets a limit to the available choices for this field when this field is rendered using aModelFormor the admin (by default, all objects in the queryset are available to choose). Either a dictionary, aQobject, or a callable returning a dictionary orQobject can be used.
For example:
staff_member=models.ForeignKey(User,on_delete=models.CASCADE,limit_choices_to={'is_staff':True},)
causes the corresponding field on theModelFormto list onlyUsersthat haveis_staff=True. This may be helpful in the Django admin.
The callable form can be helpful, for instance, when used in conjunction with the Pythondatetimemodule to limit selections by date range. For example:
deflimit_pub_date_choices():return{'pub_date__lte':datetime.date.utcnow()}limit_choices_to=limit_pub_date_choices
Iflimit_choices_tois or returns aQobject, which is useful forcomplex queries, then it will only have an effect on the choices available in the admin when the field is not listed inraw_id_fieldsin theModelAdminfor the model.
Note
If a callable is used forlimit_choices_to, it will be invoked every time a new form is instantiated. It may also be invoked when a model is validated, for example by management commands or the admin. The admin constructs querysets to validate its form inputs in various edge cases multiple times, so there is a possibility your callable may be invoked several times.
推荐阅读
- EffectiveObjective-C2.0|EffectiveObjective-C2.0 笔记 - 第二部分
- django-前后端交互
- 感恩日记第111篇2020.02.06
- 幸福2.0六组90天践行总纲指导方针
- BNC公链|BNC公链 | Eth2.0测试网Topaz已质押超100万枚ETH
- django2.2|django2.2 一般项目步骤(初步)
- 千人共读《改变的力量》|千人共读《改变的力量》 打卡第一天2020.02.02
- 我们需要正能量
- django|django 自定义.save()方法
- django|django 获取用户的域名