用于自定义操作的Django管理员自定义查询集

时间:2018-12-28 18:43:24

标签: django django-admin django-queryset django-admin-tools django-admin-actions

我对如何在django admin中执行特定查询集感到迷茫。下面是我的模型。

People(models.Model)

first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=35) 
phone_number = models.CharField(null=True, blank=True, max_length=15)

def __str__(self):
    return self.first_name

class Meta:
    verbose_name_plural = 'People'

Group_and_message(models.Model)类:

name = models.CharField(max_length=30, null=True)
people = models.ManyToManyField(Person)
message_body = models.TextField(max_length=140)
updated = models.DateTimeField(auto_now=True, auto_now_add=False)

def __str__(self):
    return self.name

在管理员中,我创建了一个自定义操作。

def send_message(modeladmin,request,queryset):     通过

我的问题是,当通过复选框在管理仪表盘中选择“ group_and_message”对象时,能够检索所选对象的“ id”和“ phone_number”,以便我可以使用它执行“ send_message”自定义操作。

下面是一些查询集步骤的基础,这些步骤展示了我想要实现的目的(仅出于说明目的)

g = Group_and_message.objects.last()#self而不是我想要的last;

g1 = g.people.all()

g2 = g1.values_list(“ id”,“电话号码”);

g3 = dict(g2)

结果为我提供了“ id”和“电话号码”。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您需要通过backwards relation访问Group_and_message。在这种情况下,对于您来说,它应该是group_and_message_set

def send_message(modeladmin, request,queryset):
    phone_map = dict(People.objects.filter(
        group_and_message_set__in=queryset,
    ).distinct().values_list('id', 'phone_number'))
    # Do something

class Group_and_messageAdmin(admin.ModelAdmin):
    actions = ['send_message']

顺便说一句,您的型号名称中不应包含下划线。而不是Group_and_message,使用GroupMessage会更像pythonic / django。