我有:
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()
可以在带有更新的数据库服务器上完成吗?
MyUser.objects.all().update(...)
好的,我无法更新,谢谢。但我唯一需要的是TRUNCATE m2m内部表,是否有可能从django执行?怎么知道这个名字没有mysql的控制台“SHOW TABLES”?
答案 0 :(得分:2)
<强>查询-1:强>
不,您无法使用.update()
方法更新ManyToManyField
。
Django的.update()
方法不支持ManyToManyField。
根据updating multiple objects at once:
部分的文档您只能使用此设置非关系字段和
ForeignKey
字段 方法。要更新非关系字段,请将新值提供为 不变。要更新ForeignKey
字段,请将新值设置为新值 您想要指向的模型实例。
<强>查询-2:强>
如果要删除m2m表的所有对象,可以使用.delete()
queryset方法。
MyModel.objects.all().delete() # deletes all the objects
另一种方法是直接执行原始SQL。这种方法比前一种方法更快。
from django.db import connection
cursor = connection.cursor()
cursor.execute("TRUNCATE TABLE table_name")
<强>查询-3:强>
要获取模型的表名,您可以使用db_table
模型Meta
选项。
my_model_object._meta.db_table # gives the db table name
答案 1 :(得分:2)
如果您只想更新m2m字段而不想删除m2m对象,可以使用以下内容:
#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)
表示django&gt; = 1.11 documentation:
# 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)