如何在django中更新m2m字段

时间:2015-09-13 18:28:58

标签: 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 MyUser.objects.all():
    u.today_ref_viewed_ips.clear()

可以在带有更新的数据库服务器上完成吗?

MyUser.objects.all().update(...)

好的,我无法更新,谢谢。但我唯一需要的是TRUNCATE m2m内部表,是否有可能从django执行?怎么知道这个名字没有mysql的控制台“SHOW TABLES”?

2 个答案:

答案 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)