Ben2pop
Ben2pop

Reputation: 756

Retrieving ID to use in a query, Django

I have a simple question I guess:

I am trying to query my data base in order to retrieve the number of team members linked to a specific team, linked to a specific project.

team_member_count = Project.objects.get(id = id).team_id.members.count()

The query is for the project detail view using a url like : localhost/website/project/141/ In the shell my query is Project.objects.get(id = 141).team_id.members.count()

but in the views I get :

TypeError: int() argument must be a string, a bytes-like object or a number, not 'builtin_function_or_method'

My view is the following (retrieving data for chart.js)

class ChartData(APIView):

    authentication_classes = []
    permission_classes = []

    def get(self, request, format=None, *args, **kwargs):
        user_count = MyUser.objects.all().count()
        project_count = Project.objects.all().count()
        team_member_count = Project.objects.get(id = id).team_id.members.count()
        labels = ["Users", "Projects", "Team_number", "Green", "Purple", "Orange"]
        default_items = [user_count, project_count,team_member_count,28,12,32]
        data = {
            "labels":labels,
            "default":default_items,
        }
        return Response(data)

Models :

class Team(models.Model):
    team_name = models.CharField(max_length=100, default = '')
    team_hr_admin = models.ForeignKey(MyUser, blank=True, null=True)
    members = models.ManyToManyField(MyUser, related_name="members")

    def __str__(self):
        return self.team_name


class Project(models.Model):
    name = models.CharField(max_length=250)
    team_id = models.ForeignKey(Team, blank=True, null=True)
    project_hr_admin = models.ForeignKey('registration.MyUser', blank=True, null=True)
    candidat_answers = models.ManyToManyField('survey.response')

    def get_absolute_url(self):
        return reverse('website:ProjectDetails', kwargs = {'pk' : self.pk})

    def __str__(self):
        return self.name

URL patterns:

app_name = 'website'
urlpatterns = [
    url(r'^hr_index/$', views.HRIndex.as_view(), name='hr_index'),
    url(r'^candidate_index/$', views.CandidateIndex.as_view(),name='candidate_index'),
    url(r'^employee_index/$', views.EmployeeIndex.as_view(),name='employee_index'),
    url(r'^addproject/$', views.ProjectCreate.as_view(), name='add_project'),
    url(r'^addteam/$', views.TeamCreate.as_view(), name='add_team'),
    url(r'^linkteam/$', views.LinkTeam.as_view(), name='link_team'),
    url(r'^linkteam2/$', views.TeamSelect, name='team_select'),
    url(r'^project/(?P<pk>[0-9]+)/$',views.ProjectDetailView.as_view(), name='ProjectDetails'),
    url(r'^project/(?P<pk>[0-9]+)/api/chart/data/$', views.ChartData.as_view(), name='chartdata'),

]

Upvotes: 0

Views: 42

Answers (1)

Daniel Roseman
Daniel Roseman

Reputation: 599540

You don't have a local variable called id in your get method; Python is assuming you're referring to the global built-in id() function, hence the error.

According to your URLs, you are capturing a keyword argument called pk. So you should get that from the kwargs dict:

Project.objects.get(id=kwargs['pk'])...

Upvotes: 2

Related Questions