ممارسة العلاقات العامة Django
-
21-09-2019 - |
سؤال
أقوم بتطوير الواجهة الخلفية للمصادقة مع أذونات قائمة على الكائنات لـ 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)
لا تنتمي إلى StackOverflow