আপনি সংরক্ষিত অবজেক্ট থেকে এম 2 মিটার সম্পর্ক তৈরি করতে পারবেন না। যদি আপনার কাছে থাকে তবে pk
এটি ব্যবহার করে দেখুন:
sample_object = Sample()
sample_object.save()
sample_object.users.add(1,2)
আপডেট: স্যাভারিওর উত্তর পড়ার পরে , আমি বিষয়টি আরও গভীরতার সাথে তদন্ত করার সিদ্ধান্ত নিয়েছি। এখানে আমার অনুসন্ধান আছে।
এটি আমার মূল পরামর্শ ছিল। এটি কাজ করে, তবে অনুকূল নয়। (দ্রষ্টব্য: আমি ব্যবহার করছি Bar
s এবং একটি Foo
পরিবর্তে User
s এবং একটি Sample
, কিন্তু আপনি ধারণা পেতে)।
bar1 = Bar.objects.get(pk=1)
bar2 = Bar.objects.get(pk=2)
foo = Foo()
foo.save()
foo.bars.add(bar1)
foo.bars.add(bar2)
এটি মোট 7 টি প্রশ্নের উত্পন্ন করে:
SELECT "app_bar"."id", "app_bar"."name" FROM "app_bar" WHERE "app_bar"."id" = 1
SELECT "app_bar"."id", "app_bar"."name" FROM "app_bar" WHERE "app_bar"."id" = 2
INSERT INTO "app_foo" ("name") VALUES ()
SELECT "app_foo_bars"."bar_id" FROM "app_foo_bars" WHERE ("app_foo_bars"."foo_id" = 1 AND "app_foo_bars"."bar_id" IN (1))
INSERT INTO "app_foo_bars" ("foo_id", "bar_id") VALUES (1, 1)
SELECT "app_foo_bars"."bar_id" FROM "app_foo_bars" WHERE ("app_foo_bars"."foo_id" = 1 AND "app_foo_bars"."bar_id" IN (2))
INSERT INTO "app_foo_bars" ("foo_id", "bar_id") VALUES (1, 2)
আমি নিশ্চিত যে আমরা আরও ভাল করতে পারি। আপনি add()
পদ্ধতিতে একাধিক বস্তু পাস করতে পারেন :
bar1 = Bar.objects.get(pk=1)
bar2 = Bar.objects.get(pk=2)
foo = Foo()
foo.save()
foo.bars.add(bar1, bar2)
আমরা দেখতে পাচ্ছি, একাধিক বস্তু পাস করা একটি সংরক্ষণ করে SELECT
:
SELECT "app_bar"."id", "app_bar"."name" FROM "app_bar" WHERE "app_bar"."id" = 1
SELECT "app_bar"."id", "app_bar"."name" FROM "app_bar" WHERE "app_bar"."id" = 2
INSERT INTO "app_foo" ("name") VALUES ()
SELECT "app_foo_bars"."bar_id" FROM "app_foo_bars" WHERE ("app_foo_bars"."foo_id" = 1 AND "app_foo_bars"."bar_id" IN (1, 2))
INSERT INTO "app_foo_bars" ("foo_id", "bar_id") VALUES (1, 1)
INSERT INTO "app_foo_bars" ("foo_id", "bar_id") VALUES (1, 2)
আপনি অবজেক্টের একটি তালিকাও অর্পণ করতে পারেন তা আমি অবগত ছিলাম না:
bar1 = Bar.objects.get(pk=1)
bar2 = Bar.objects.get(pk=2)
foo = Foo()
foo.save()
foo.bars = [bar1, bar2]
দুর্ভাগ্যক্রমে, এটি একটি অতিরিক্ত তৈরি করে SELECT
:
SELECT "app_bar"."id", "app_bar"."name" FROM "app_bar" WHERE "app_bar"."id" = 1
SELECT "app_bar"."id", "app_bar"."name" FROM "app_bar" WHERE "app_bar"."id" = 2
INSERT INTO "app_foo" ("name") VALUES ()
SELECT "app_foo_bars"."id", "app_foo_bars"."foo_id", "app_foo_bars"."bar_id" FROM "app_foo_bars" WHERE "app_foo_bars"."foo_id" = 1
SELECT "app_foo_bars"."bar_id" FROM "app_foo_bars" WHERE ("app_foo_bars"."foo_id" = 1 AND "app_foo_bars"."bar_id" IN (1, 2))
INSERT INTO "app_foo_bars" ("foo_id", "bar_id") VALUES (1, 1)
INSERT INTO "app_foo_bars" ("foo_id", "bar_id") VALUES (1, 2)
আসুন pk
সেভেরিওর পরামর্শ অনুসারে এর একটি তালিকা নির্ধারণের চেষ্টা করি :
foo = Foo()
foo.save()
foo.bars = [1,2]
যেহেতু আমরা দু'টি আনব না Bar
, আমরা দুটি SELECT
বিবৃতি সংরক্ষণ করি , যার ফলস্বরূপ মোট 5:
INSERT INTO "app_foo" ("name") VALUES ()
SELECT "app_foo_bars"."id", "app_foo_bars"."foo_id", "app_foo_bars"."bar_id" FROM "app_foo_bars" WHERE "app_foo_bars"."foo_id" = 1
SELECT "app_foo_bars"."bar_id" FROM "app_foo_bars" WHERE ("app_foo_bars"."foo_id" = 1 AND "app_foo_bars"."bar_id" IN (1, 2))
INSERT INTO "app_foo_bars" ("foo_id", "bar_id") VALUES (1, 1)
INSERT INTO "app_foo_bars" ("foo_id", "bar_id") VALUES (1, 2)
এবং বিজয়ী:
foo = Foo()
foo.save()
foo.bars.add(1,2)
pk
এস পাস করা add()
আমাদের মোট 4 টি কোয়েরি দেয়:
INSERT INTO "app_foo" ("name") VALUES ()
SELECT "app_foo_bars"."bar_id" FROM "app_foo_bars" WHERE ("app_foo_bars"."foo_id" = 1 AND "app_foo_bars"."bar_id" IN (1, 2))
INSERT INTO "app_foo_bars" ("foo_id", "bar_id") VALUES (1, 1)
INSERT INTO "app_foo_bars" ("foo_id", "bar_id") VALUES (1, 2)