0

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".

Any help would be much appreciated.

Curtis Banks
  • 342
  • 4
  • 20

1 Answers1

1

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.

schillingt
  • 13,493
  • 2
  • 32
  • 34