জ্যাঙ্গো ইন / কোয়েরিতে নেই


105

আমি জ্যাঙ্গোতে কীভাবে 'ইন না' স্টাইলের ক্যোয়ারী লিখব তা বোঝার চেষ্টা করছি। উদাহরণস্বরূপ, আমি যে ক্যোয়ারী কাঠামোর কথা ভাবছি তা এর মতো দেখাবে।

select table1.* 
from table1
where table1.id not in 
(
  select table2.key_to_table1
  from table2 
  where table2.id = some_parm 
)

টেঙ্গ 1 এবং টেবিল 2 নামক মডেলগুলি ধরে নিয়ে জ্যাঙ্গো সিনট্যাক্সটি দেখতে কেমন হবে?

উত্তর:


169
table1.objects.exclude(id__in=
    table2.objects.filter(your_condition).values_list('id', flat=True))

বাদ দেওয়া ফাংশন Notঅপারেটরের মতো আপনার যেখানে জিজ্ঞাসা করছে সেখানে কাজ করে । বৈশিষ্ট্যটি এক স্তরের তালিকা হিসাবে ফিরে আসতে জিজ্ঞাসা করতে flat = Trueবলে । সুতরাং ... শেষে আপনি টেবিল 2 থেকে একটি তালিকা পেয়েছেন, যা আপনি ব্যবহারকারীকে শর্তটি সংজ্ঞায়িত করতে যাচ্ছেন , এটি বাদ দেওয়া ফাংশন দ্বারা অস্বীকার করা হবে।table2value_listIDstable1


4
তালিকাটি নির্মাণকারী [টেবিল 2 ...] -> তালিকা (টেবিল 2 ...) আমার পক্ষে কাজ করেছে বলেও আমার সমস্যা ছিল।
রিকিএ

4
সংশোধন: টেবিল 1.ওবজেক্ট.এক্সক্লুড (আইডি__ ইন = টেবিল 2.ওবজেক্টস.ফিল্টার (আপনার_কন্ডিশন)। মূল্যবোধ_তালিকা ('আইডি', ফ্ল্যাট = সত্য))
রিচার্ড

4
এই সমাধানটি ব্যবহার করার চেষ্টা করা হয়েছিল এবং কোনও সমস্যার মধ্যে পড়েছিল, তাই যদি এটি অন্য কারও সাথে ঘটে তবে ... Objs=Tbl1.objects.filter(...); IDs=Objs.values_list('id', flat=True); Objs.delete(); Tbl2.objects.filter(id__in=IDs')এটি কার্যকর হয়নি কারণ আইডিগুলি আসলে একটি ক্যোরিসেট অবজেক্ট। আমি যখন সারিগুলি থেকে উত্পন্ন উত্সগুলি মুছে ফেলি তখন এটি আর অনুসন্ধানগুলির সাথে আর কাজ করে না। সমাধানটি হল Tbl2.objects.filter(id__in=list(IDs))- এটিকে একটি তালিকায় পরিণত করুন
ডাকসান

4
প্রসঙ্গের উপর নির্ভর করে, যদি ফিল্টারটি "গণনা করা (xx) == yy" এর মতো হয় তবে এটি ব্যবহার করা 100x এর চেয়ে বেশি দ্রুত annotate()(সময়সূচি আমাকে 1.0497902309998608 বনাম 0.00514069400014705 দিয়েছে)
অলিভিয়ার পন্স

11

এই মডেলগুলির সাথে:

class table1(models.Model):
    field1 = models.CharField(max_length=10)      # a dummy field

class table2(models.Model):
    key_to_table1 = models.ForeignKey(table1)

আপনি যা ব্যবহার করতে চান তা পাওয়া উচিত:

table1.objects.exclude(table2=some_param)

4
এটি এখনও আপনাকে ডিবি থেকে অকারণে প্রচুর রেকর্ড টানতে পারে।
জে টেলর


1

আপনি জ্যাঙ্গো ক্যোয়ারীগুলির জন্য একটি কাস্টম লুক লিখতে পারেন:

থেকে ডকুমেন্টেশন : "। একটি সহজ কাস্টম লুকআপ সঙ্গে আসুন শুরু আমরা একটি কাস্টম লুকআপ লিখতে হবে NE যা বিপরীত কাজ করে সঠিকAuthor.objects.filter (name__ne = 'জ্যাক') এসকিউএল অনুবাদ হবে: "author"."name" <> 'Jack'"

from django.db.models import Lookup

class NotEqual(Lookup):
    lookup_name = 'ne'

    def as_sql(self, compiler, connection):
        lhs, lhs_params = self.process_lhs(compiler, connection)
        rhs, rhs_params = self.process_rhs(compiler, connection)
        params = lhs_params + rhs_params
        return '%s <> %s' % (lhs, rhs), params

-16
[o1 for o1 in table1.objects.all() if o1.id not in [o2.id for o2 in table2.objects.filter(id=some_parm)]]

বা আরও ভাল

not_in_ids = [obj.id for obj in table2.objects.filter(id=some_parm)]
selected_objects = [obj for obj in table1.objects.iterator() if obj.id not in not_in_ids]

12
একটি টেবিলের প্রতিটি সারি উপর Iterating। জিজি
রিবস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.