Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在django中更新m2m字段_Sql_Django_Many To Many - Fatal编程技术网

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:

要获取模型的表名,可以使用model
Meta
选项

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)