【问题标题】:Insert into django many to many table without executing select在不执行选择的情况下插入 django 多对多表
【发布时间】:2016-06-29 11:42:01
【问题描述】:

我想在 Django 多对多表中执行简单的插入操作,例如:

INSERT INTO "chat_room_users" ("room_id", "user_id") values (35, 6)

这是我的 models.py

class User(AbstractBaseUser):
    ...

class Room(models.Model):
    users = models.ManyToManyField(User, related_name='rooms')
    ...

code.py

print('start')
room = Room.objects.get(id=35)
user = User.objects.get(id=6)
room.users.add(user)
print('finish')

在这种情况下,Django 执行 3 次数据库查询,这是日志

start
SELECT "chat_room"."id", "chat_room"."name", "chat_room"."disabled" FROM "chat_room" WHERE "chat_room"."id" = 35; args=(35,)
SELECT "chat_user"."id", "chat_user"."password", "chat_user"."last_login", "chat_user"."username", "chat_user"."sex" FROM "chat_user" WHERE "chat_user"."id" = 6; args=(6,)
BEGIN; args=None
SELECT "chat_room_users"."user_id" FROM "chat_room_users" WHERE ("chat_room_users"."room_id" = 35 AND "chat_room_users"."user_id" IN (6)); args=(35, 6)
INSERT INTO "chat_room_users" ("room_id", "user_id") SELECT 35, 6; args=(35, 6)
finish

我希望 Django 只执行 1 个插入查询,而不是那些无用的选择。如何使用 Django QuerySet 实现这一点?

  1. 我不想使用原生查询
  2. 我不想创建中间体 表,因为一些 Django 功能不适用于它。

提前感谢您的帮助!

最好的问候,

【问题讨论】:

    标签: django python-3.x django-models


    【解决方案1】:

    您可以通过Room.users.through 访问自动创建的模型。所以:

    Room.users.through.objects.create(room_id=35, user_id=6)
    

    【讨论】:

    • 正是我想要的,简单的代表;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 2015-09-17
    • 2012-05-06
    • 2015-09-28
    • 2011-07-29
    • 1970-01-01
    相关资源
    最近更新 更多