Pertanyaan Kapan saya harus menggunakan Manajer kustom versus Custom QuerySet di Django?


Di Django, Manajer khusus adalah cara yang bagus untuk mengatur logika kueri yang dapat digunakan kembali. Itu dokumen menyatakan bahwa ada dua alasan Anda mungkin ingin menyesuaikan Manajer: untuk menambahkan metode Manajer tambahan, dan / atau untuk memodifikasi QuerySet awal, Manajer akan kembali.

Namun, itu terus menggambarkan bagaimana Custom QuerySets juga dapat dibuat, dan bahwa ini dapat diakses langsung dari model data sebagai pengelola melalui QuerySet.as_manager(). Instance Manager yang dibuat oleh QuerySet.as_manager () akan hampir identik dengan PersonManager dari contoh sebelumnya.

Sepertinya ada banyak fleksibilitas dalam bagaimana seseorang dapat mengatur logika mereka antara Manajer kustom dan / atau QuerySet khusus. Dapatkah seseorang menjelaskan prinsip-prinsip yang dengannya saya harus memutuskan kapan menggunakan yang satu dibandingkan yang lain?


32
2018-04-22 12:49


asal


Jawaban:


Terutama untuk memudahkan komposisi query. Umumnya jika Anda ingin dapat melakukan beberapa operasi pada suatu queryset yang ada dalam rantai panggilan queryset Anda dapat menggunakan QuerySet.

Misalnya, katakanlah Anda memiliki Image model yang memiliki width, height ladang:

class Image(models.Model):
    width = ...  # Width in pixels
    height = ... # Height in pixels

Anda bisa menulis beberapa kebiasaan QuerySet metode:

class ImageQuerySet(models.QuerySet): 
    def landscapes(self):
        return self.filter(width__gte=models.F('height'))

    def portraits(self):
        return self.filter(width__lte=models.F('height'))

    def small(self):
        return self.filter(width__lte=1200)

    def large(self):
        return self.filter(width__gte=1200)

class ImageManager(models.Manager):
    def get_queryset(self):
        return ImageQuerySet(self.model, using=self._db)

sekarang Anda dapat dengan mudah membuat query yang dinamis:

Image.objects.all().portraits().small()
Image.objects.all().large().portraits()

Secara logis, fungsi-fungsi ini harus terutama berkaitan dengan partisi atau mendefinisikan ulang dari query yang sudah ada dari model queryset. Untuk situasi di mana Anda tidak beroperasi pada query yang sudah ada, Anda tidak ingin mengembalikan queri set sama sekali, atau Anda mungkin harus melakukan beberapa logika terkait yang tidak melibatkan model khusus ini, daripada manajer model yang lebih cocok.


18
2018-04-22 13:05