Search code examples
djangojoin

Cannot resolve keyword 'mem_ev' into field in Django


I have a small Django project that consists of 2 models (Event, mem_ev) plus auth User and Profile such that Users --< mem_ev >-- Events (ie a classic many to many relationship between Users & Events).

I want to be able to list all events for a member and all members for an event both of which entail a join between the main dataset and mem_ev.

I have the list of events attended by a member working fine (list_member_events) but cannot get a list of members attending an event (list_event_members) working.

My models.py is:

from django.db import models
from django.utils.text import slugify
from django.contrib.auth.models import User

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE) # Delete profile when user is deleted
    event_count = models.IntegerField(default=0)

    def __str__(self):
        return f'{self.user.username} Profile' #show how we want it to be displayed

class Event(models.Model):
    title = models.CharField(max_length=50)
    slug = models.SlugField(max_length=50,default="", null=False)
    description = models.TextField()
    cost = models.DecimalField(max_digits = 5, decimal_places = 2, default = 0.0)
    event_date = models.DateTimeField(null=True,blank=True)
    attendees = models.IntegerField(default=0)

    class Meta:
        ordering = ['event_date']

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(Event, self).save(*args, **kwargs)

    class Meta:
        ordering = ['event_date']

    def __str__(self):
        return self.title

class mem_ev(models.Model):
    member_id = models.ForeignKey("Profile",on_delete=models.CASCADE)
    event_id = models.ForeignKey("Event",on_delete=models.CASCADE)
    amt_paid = models.DecimalField(max_digits = 5, decimal_places = 2, default = 0.0)
    date_paid = models.DateTimeField(null=True,blank=True)

My views.py is:

from django.shortcuts import render, redirect
from django.contrib import messages
from django.contrib.auth.models import User
from django.http import HttpResponse
from django.contrib.auth import authenticate, login
from .models import Event, mem_ev, Profile
from .forms import UserRegistrationForm
from django.contrib.auth.decorators import login_required
from django.contrib.auth import get_user_model

...

def list_event_members(request,id):
    User = get_user_model()
    event_members = User.objects.filter(mem_ev__event_id=id)
    return render(request,'wf/list_event_members.html',{'event_members':event_members})

@login_required
def list_member_events(request,id,username):
    member_events = Event.objects.filter(mem_ev__member_id=id)
    user = User.objects.get(username=username)
    return render(request,'wf/list_member_events.html',{'member_events':member_events,'member':user})

The error I'm getting back is:

FieldError at /list_event_members/8/

Cannot resolve keyword 'mem_ev' into field. Choices are: date_joined, email, first_name, groups, id, is_active, is_staff, is_superuser, last_login, last_name, logentry, password, profile, user_permissions, username

/home/dconran/django/mysite/wf/views.py, line 33, in list_event_members

        event_members = User.objects.filter(mem_ev__event_id=id)
                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 

Clearly it doesn't like the mem_ev bit of the filter but why when it is quite happy with that for list_member_events?

And how do I fix it?


Solution

  • You are working with profile, not User, so:

    event_members = User.objects.filter(profile__mem_ev__event_id=id)