Curtis Banks
Curtis Banks

Reputation: 362

Django admin custom queryset for a custom action

I am a bit lost on how to perform a specific queryset in django admin. Below are my models.

class 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'

class 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

In Admin, I have created a custom action.

def send_message(modeladmin, request,queryset):
    pass

My question is to be able, when selecting a "group_and_message" object in the admin dashboard via the checkbox, be able to retrieve "id" and "phone_number" of the selected object so i can use it to perform "send_message" custom action.

Below is the equivalent of basic of a few queryset steps that showcase what i am trying to achieve (just for illustration purpose)

g = Group_and_message.objects.last()  # self instead of last is what i want;
g1 = g.people.all()
g2 = g1.values_list("id","phone_number")
g3 = dict(g2)

The result gives me the "id" and "phone number".

Upvotes: 0

Views: 2217

Answers (1)

schillingt
schillingt

Reputation: 13731

You need to access the Group_and_message via the backwards relation. In this case for you, it should be 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']

As an aside, you shouldn't have underscores in your model names. Rather than Group_and_message, it'd be more pythonic/django-like to use GroupMessage.

Upvotes: 1

Related Questions