Sql 如何在django中更新m2m字段
我有: 根据一些老朋友的日常要求,我会:Sql 如何在django中更新m2m字段,sql,django,many-to-many,Sql,Django,Many To Many,我有: 根据一些老朋友的日常要求,我会: class MyUser(Model): today_ref_viewed_ips = ManyToManyField( UniqAddress, related_name='today_viewed_users', verbose_name="Adresses visited referal link today") ... 可以在数据库服务器上完成更新吗 for u in MyUs
class MyUser(Model):
today_ref_viewed_ips = ManyToManyField(
UniqAddress,
related_name='today_viewed_users',
verbose_name="Adresses visited referal link today")
...
可以在数据库服务器上完成更新吗
for u in MyUser.objects.all():
u.today_ref_viewed_ips.clear()
好的,我无法更新,谢谢。但我唯一需要的是截断m2m内部表,可以从django执行吗?如何在没有mysql控制台“显示表”的情况下知道它的名称?Query-1: 否,您不能使用方法更新。 Django的
.update()
方法不支持ManyToManyField
根据上一节中的文档
您只能使用此选项设置非关系字段和字段
方法。要更新非关系字段,请将新值作为
常数要更新ForeignKey
字段,请将新值设置为新值
要指向的模型实例
Query-2:
如果要删除m2m表的所有对象,可以使用queryset方法
MyUser.objects.all().update(...)
另一种方法是直接执行原始SQL。这种方法比以前的方法快
MyModel.objects.all().delete() # deletes all the objects
Query-3:
要获取模型的表名,可以使用modelMeta
选项
from django.db import connection
cursor = connection.cursor()
cursor.execute("TRUNCATE TABLE table_name")
如果只想更新m2m字段而不想删除m2m对象,可以使用以下选项:
my_model_object._meta.db_table # gives the db table name
对于django>=1.11:
是的,但我没有m2m MyModel类,正如您所看到的,我只有今天的\u ref\u viewsed\u ips=ManyToManyField,还有一些元信息吗?
UniqAddress
是今天的\u ref\u viewsed\u ips的模型。要获取其表名,可以使用uniq\u address\u对象。\u meta.db\u table
。在此模型上使用.delete()
将删除UniqAddress
表中的所有对象。如果要执行UniqAddress.objects.delete()
,请仔细考虑,因为此模型的所有对象都将被删除。
#if you have **list of pk** for new m2m objects
today_ref_pk = [1,2,3]
u = MyUser.objects.get(pk=1)
u.today_ref_viewed_ips.clear()
u.today_ref_viewed_ips.add(*today_ref_pk)
# if you have the **list of objects** for new m2m and you dont have the
# issue of race condition, you can do the following:
today_ref_objs = [obj1, obj2, obj3]
u = MyUser.objects.get(pk=1)
u.today_ref_viewed_ips.set(today_ref_objs, clear=True)