জাজানো অনেকগুলি থেকে অনেকগুলি রয়েছে এমন ফিল্টার করে


90

আমি বহু-থেকে-বহু সম্পর্কের মাধ্যমে গুচ্ছ অবজেক্টগুলিকে ফিল্টার করার চেষ্টা করছি। কারণ trigger_rolesফিল্ডটিতে একাধিক এন্ট্রি থাকতে পারে আমি containsফিল্টারটি চেষ্টা করেছি । তবে যেগুলি স্ট্রিংয়ের সাথে ব্যবহার করার জন্য ডিজাইন করা হয়েছে আমি কীভাবে এই সম্পর্কটি ফিল্টার করব তা আমি বেশ অসহায় (আপনি values_list()এটিএমটিকে উপেক্ষা করতে পারেন ))।

এই ফাংশনটি ব্যবহারকারীর প্রোফাইলে সংযুক্ত রয়েছে:

def getVisiblePackages(self):
    visiblePackages = {}   
    for product in self.products.all():
        moduleDict = {}
        for module in product.module_set.all():
            pkgList = []
            involvedStatus = module.workflow_set.filter(trigger_roles__contains=self.role.id,allowed=True).values_list('current_state', flat=True)

আমার ওয়ার্কফ্লো মডেলটি দেখতে (সরলীকৃত):

class Workflow(models.Model):
    module = models.ForeignKey(Module)
    current_state = models.ForeignKey(Status)
    next_state = models.ForeignKey(Status)
    allowed = models.BooleanField(default=False)
    involved_roles = models.ManyToManyField(Role, blank=True, null=True)
    trigger_roles = models.ManyToManyField(Role, blank=True, null=True)

যদিও সমাধানটি খুব সহজ হতে পারে তবে আমার মস্তিষ্ক আমাকে বলবে না।

আপনার সাহায্যের জন্য ধন্যবাদ.

উত্তর:


110

আপনি কি এরকম কিছু চেষ্টা করেছেন:

module.workflow_set.filter(trigger_roles__in=[self.role], allowed=True)

বা self.role.idpks এর তালিকা না হলে কেবল :

module.workflow_set.filter(trigger_roles__id__exact=self.role.id, allowed=True)

4
কাজ করে বলে মনে হয় না। যেহেতু self.rol.id কেবল একটি অন্তর্নিহিত এবং ট্রিগার_লগুলি সেগুলির একটি তালিকা, আমার একটি উল্টানো দরকার, যেমন রয়েছে তবে আমি খুঁজে পেয়েছি, কেবল স্ট্রিংয়ের জন্য রয়েছে।
কবর_জম্পার

8
দ্বিতীয় উদাহরণ কাজ করা উচিত । যদি মানটি self.role.idট্রিগার ভূমিকাগুলির মধ্যে একটি হয়, তবে সেই ফিল্টারটি এমন সমস্ত কর্মপ্রবাহ টানতে হবে যেখানে ট্রিগার ভূমিকাগুলির মধ্যে একটির মান self.role.id। মূলত এটি "অন্তর্ভুক্ত" ফাংশনের মতো হুবহু আচরণ করবে। যদি না আমরা সবাই কিছু মিস করি।
জর্ডান রিয়েটার

@ জর্দান রিয়েটার: "সমন্বিত" গুলোকে স্কেল-এ "লাইক" তে রূপান্তরিত করা হয় যা ওপি যা চায় তা নয় এবং আমি মনে করি তিনি ইতিমধ্যে এটি উল্লেখ করেছেন, অন্যদিকে "হুবহু" কে "=" বা "" "তে রূপান্তরিত করা হয়েছে যা ধারণা এখানে।
মোডে

@ গ্রাভ_জম্পার: এখানে একবার দেখুন ( djangoproject.com/docamentation/models/many_to_many ) ম্যান্তোম্যানি ফিল্ডের সাথে কাজ করার সময় আপনি কিছু উদাহরণ খুঁজে পেতে পারেন, আশা করি এটি আপনাকে সহায়তা করতে পারে, যদি আমার উত্তরটি না পাওয়া যায় :)
মউড

4
ওও .. দুঃখিত আপনার দ্বিতীয় সমাধানটি ভালভাবে শান্ত কাজ করে :) আমার দিকে কিছুটা মিস কনফিগারেশন ছিল। ধন্যবাদ ছেলেরা এটি আমার দিন বাঁচিয়েছে ;-)
গ্রেভ_জম্পার

19

এটি অর্জনের সবচেয়ে সহজ পদ্ধতির মধ্যে সম্পূর্ণরূপে আইডিটির পরিবর্তে (আইডির পরিবর্তে) সমতা পরীক্ষা করা হবে ManyToManyField। উদাহরণটি অনেকের মধ্যে বহু সম্পর্কের মধ্যে রয়েছে কিনা তা দেখে মনে হচ্ছে। উদাহরণ:

module.workflow_set.filter(trigger_roles=self.role, allowed=True)

7

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে দেখে মনে হচ্ছে ওপি কখনই তার উত্তর খুঁজছিল না। আপনি যে তুলনা করতে চান তাতে মন্টটোমনিফিল্ডসের দুটি সেট থাকলে কৌশলটি হ'ল __inঅপারেটরটি ব্যবহার করা , নয় contains। সুতরাং উদাহরণস্বরূপ, যদি আপনার মাঠে একটি "মন্টি টোমনি" থেকে "গ্রুপ" থেকে একটি "ইভেন্ট" মডেল থাকে eventgroupsএবং আপনার ব্যবহারকারী মডেল (স্পষ্টতই) গ্রুপে সংযুক্ত থাকে, আপনি এই জাতীয় প্রশ্ন করতে পারেন:

Event.objects.filter(eventgroups__in=u.groups.all())


4

একাকীত্ব প্রথম উদাহরণ সঙ্গে প্রায় সঠিক। আপনার এটি নিশ্চিত করা দরকার যে এটি একটি তালিকা। দ্বিতীয় উদাহরণ, চেক trigger_roles__id__exactকরা আরও ভাল সমাধান যদিও।

module.workflow_set.filter(trigger_roles__in=[self.role.id],allowed=True)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.