سؤال

أقوم بتطوير الواجهة الخلفية للمصادقة مع أذونات قائمة على الكائنات لـ Django-App.I استخدم علاقات عامة بين كائن وإذن:

class GroupPermission(models.Model):
    content_t= models.ForeignKey(ContentType,related_name='g_content_t')
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_t', 'object_id')
    permission=models.ForeignKey(Permission)
    group = models.ForeignKey(Group)

والآن أريد أن أحصل على جميع كائنات نوع المحتوى المحدد الذي يكون لدى مجموعة أو مستخدم مؤكد من أجله. ما هي أفضل طريقة للقيام بذلك؟ هل أحدد الطرف الثاني من العلاقة في نماذج التطبيق؟ أو من الأفضل كتابة SQL مخصصة؟ أحاول بناء الواجهة الخلفية العامة حتى لا أريد أن تعتمد على التطبيق الذي يستخدمه. شكرًا!

هل كانت مفيدة؟

المحلول

أظن أنك تبحث عن شيء مثل:

perm = Permission.objects.get(pk=1) # pk #1 for brevity.
group = Group.objects.get(pk=1)     # Again, for brevity.
group_perms = GroupPermission.objects.filter(permission=perm, group=group)
objects = [x.content_object for x in group_perms]

هذا يجب أن يحصل على جميع الكائنات التي لديها إذن perm, ومجموعة من group في المتغير objects.

يمكنك تنفيذ هذا في مدير مخصص الفصل ، كذلك:

class GroupPermissionManager(models.Manager):
    def for(self, perm):
        group_perms = GroupPermission.objects.filter(permission=perm, group=self)
        objects = [x.content_object for x in group_perms]

class Group(models.Model):
    name = models.CharField(max_length=30)
    permissions = GroupPermissionManager()

مما سيجعل رمز العرض أكثر بساطة:

perm = Permission.objects.get(pk=1) # pk #1 for brevity.
group = Group.objects.get(pk=1)     # Again, for brevity.
objects = group.permissions.for(perm)    
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top