জ্যাঙ্গো অ্যাডমিন: কোনও ডাটাবেস ক্ষেত্র নেই এমন কাস্টম তালিকা_ডিসপ্লে ক্ষেত্রের মাধ্যমে কীভাবে সাজান


122
# admin.py
class CustomerAdmin(admin.ModelAdmin):  
    list_display = ('foo', 'number_of_orders')

# models.py
class Order(models.Model):
    bar = models.CharField[...]
    customer = models.ForeignKey(Customer)

class Customer(models.Model):
    foo = models.CharField[...]
    def number_of_orders(self):
        return u'%s' % Order.objects.filter(customer=self).count()  

গ্রাহকরা কীভাবে number_of_ordersতাদের উপর নির্ভর করে বাছাই করতে পারেন?

admin_order_fieldএখানে সম্পত্তি ব্যবহার করা যায় না, কারণ এটি বাছাই করার জন্য একটি ডাটাবেস ক্ষেত্র প্রয়োজন। জ্যাঙ্গো বাছাই করার জন্য অন্তর্নিহিত ডিবি-র উপর নির্ভর করে, এগুলি কি আদৌ সম্ভব? অর্ডার সংখ্যা ধারণ করতে একটি সামগ্রিক ক্ষেত্র তৈরি করা এখানে ওভারকিলের মতো মনে হয়।

মজার বিষয়: আপনি যদি এই কলামটি বাছাই করতে ব্রাউজারে হাত দিয়ে url পরিবর্তন করেন - এটি প্রত্যাশার মতো কাজ করে!


"মজার বিষয়: আপনি যদি এই কলামটি বাছাই করতে ব্রাউজারে হাত দিয়ে url পরিবর্তন করেন - এটি প্রত্যাশার মতো কাজ করে!" আপনি যেমন বোঝাতে চাইছেন: / অ্যাডমিন / মায়াপ / গ্রাহক /? ওট = এসসি ও ও = 2 আপনি কি নিশ্চিত?
অ্যান্ডি বাকের

হ্যাঁ, এসিএস এবং ডিএসসি উভয়ই। সম্ভবত এটি দশমিকের সাথে কাজ করে।
মাইকে_ কে

আমি মনে করি না এটি একাধিক পৃষ্ঠাগুলির সাথে কাজ করবে।
চেজ সেবার্ট

উত্তর:


159

আমি এই সমস্যার গ্রেগের সমাধান পছন্দ করেছিলাম তবে আমি এটি উল্লেখ করতে চাই যে আপনি সরাসরি অ্যাডমিনের মাধ্যমে একই জিনিসটি করতে পারেন:

from django.db import models

class CustomerAdmin(admin.ModelAdmin):
    list_display = ('number_of_orders',)

    def get_queryset(self, request):
    # def queryset(self, request): # For Django <1.6
        qs = super(CustomerAdmin, self).get_queryset(request)
        # qs = super(CustomerAdmin, self).queryset(request) # For Django <1.6
        qs = qs.annotate(models.Count('order'))
        return qs

    def number_of_orders(self, obj):
        return obj.order__count
    number_of_orders.admin_order_field = 'order__count'

এইভাবে আপনি কেবল অ্যাডমিন ইন্টারফেসের অভ্যন্তরে টিকা দেবেন। আপনার করা প্রতিটি প্রশ্নের সাথে নয়।


5
হ্যাঁ, এটি একটি আরও ভাল উপায়। :)
গ্রেগ

2
একটা ব্যাপার প্রস্তাবিত সম্পাদনা এই উত্তরে। আমি এটি প্রত্যাখ্যান করার পক্ষে ভোট দিয়েছি কারণ এটি অত্যধিক পাঠ্য সরিয়ে দিয়েছে। আমি জ্যাঙ্গো জানি না, প্রস্তাবিত কোড পরিবর্তনটি উল্লেখযোগ্য কিনা তা আমার কোনও ধারণা নেই।
গিলস 'তাই মন্দ হওয়া বন্ধ করুন'

1
@ গিলস প্রস্তাবিত সম্পাদনাটি একটি সহজ সংখ্যার_অর্ডার সংজ্ঞা সম্পর্কে সঠিক। এটি কাজ করে: def number_of_orders(self, obj): return obj.order__count
নীল

1
এর get_queryset()পরিবর্তে কি শোনাবেন না queryset()?
মারিউজ জামরো

2
get_queryset হওয়া উচিত (স্ব, অনুরোধ): ... জাজানো 1.6+ এর জন্য
মাইকেল 25

50

আমি এটি পরীক্ষা করে দেখিনি (আমি এটির কাজ করে কিনা তা জানতে আগ্রহী) তবে কাস্টম ম্যানেজারকে সংজ্ঞায়িত করার বিষয়ে কী কী Customerযার জন্য অর্গ্রেড অর্ডারগুলির সংখ্যার অন্তর্ভুক্ত রয়েছে, এবং তারপরে admin_order_fieldসেই সমষ্টিতে সেট করা, অর্থাৎ

from django.db import models 


class CustomerManager(models.Manager):
    def get_query_set(self):
        return super(CustomerManager, self).get_query_set().annotate(models.Count('order'))

class Customer(models.Model):
    foo = models.CharField[...]

    objects = CustomerManager()

    def number_of_orders(self):
        return u'%s' % Order.objects.filter(customer=self).count()
    number_of_orders.admin_order_field = 'order__count'

সম্পাদনা: আমি এই ধারণাটি স্রেফ পরীক্ষা করেছি এবং এটি পুরোপুরি কার্যকরভাবে কাজ করে - জাজানো অ্যাডমিনের সাবক্লাসিংয়ের প্রয়োজন নেই!


1
গৃহীত উত্তরটির তুলনায় এটি উত্তম উত্তর। আমি যে বিষয়টি গ্রহণযোগ্যটিকে প্রয়োগ করতে পেরেছি তা হ'ল আপনি যখন প্রশাসক পর্যায়ে আপডেট হওয়া ক্যোয়ারসেটের সাথে কিছু সন্ধান করেন, এটি খুব বেশি সময় নেয় এবং এটি প্রাপ্ত ফলাফলগুলির জন্য ভুল গণনাও উপস্থিত হয়।
মিউট্যান্ট

0

ক্ষেত্রটিকে অস্বীকৃতি জানাই একমাত্র উপায়। এটি হ'ল - এমন একটি আসল ক্ষেত্র তৈরি করুন যা সেখান থেকে উত্পন্ন ক্ষেত্রগুলির সাথে সুসংগত থাকার জন্য আপডেট হয়। আমি সাধারনত অস্বীকৃত ক্ষেত্রগুলির সাথে মডেল বা এটি থেকে উত্পন্ন মডেলটির সাথে ইডে সেভকে ওভাররাইড করে করি:

# models.py
class Order(models.Model):
    bar = models.CharField[...]
    customer = models.ForeignKey(Customer)
    def save(self):
        super(Order, self).save()
        self.customer.number_of_orders = Order.objects.filter(customer=self.customer).count()
        self.customer.save()

class Customer(models.Model):
    foo = models.CharField[...]
    number_of_orders = models.IntegerField[...]

1
এটি অবশ্যই কাজ করা উচিত, তবে অতিরিক্ত ডিবি ক্ষেত্রে জড়িত থাকার কারণে এটি গ্রহণযোগ্য হিসাবে চিহ্নিত করতে পারে না can't ক্যোয়ারী-সেট লাইনের শেষে .count () অনুপস্থিত নোট করুন।
মাইক_কে

গণনা স্থির করে ()। কেবলমাত্র অন্য সমাধান (অবগ্রহ। অ্যাডমিনের বৃহত অংশগুলি সাবক্লাসিংয়ের সংক্ষিপ্ততা) হ'ল জ্যাকুয়ারি / অ্যাজ্যাক্সি হ্যাক।
অ্যান্ডি বেকার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.