简体   繁体   中英

Django Queryset foreign keys

I am trying to get a queryset but it is not displaying anything. Basically, I want to get the Asset objects that are assigned via foreign key to an employee, which is a foreign key of the signed in user.

views.py

def get_queryset(self):
        assetlist = Asset.objects.filter(organisation__employee__user=self.request.user)
        print(assetlist)
        return assetlist

models.py

class Employee(models.Model):
    name = models.CharField("Employee Name", max_length=50, blank=False)
    email = models.CharField("Employee Email", max_length=50, blank=True)
    user = models.ForeignKey(User)
    clientID = models.ForeignKey(Organisation)

    def save(self):
        self.name = self.user.get_full_name()
        self.email = self.user.email
        super(Employee, self).save()

    def __str__(self):
        return self.name


class Asset(models.Model):
    name = models.CharField("Asset Name", max_length=30, primary_key=True)
    organisation = models.ForeignKey(Organisation)

    def __str__(self):
        return self.name


class Organisation(models.Model):
    name = models.CharField("Organisation Name", max_length=50, blank=False)
    location = models.TextField("Organisation Address", max_length=200, blank=True)
    tel = models.CharField("Telephone Number", max_length=20)

    def __str__(self):
        return self.name

There is no employee field inside organisation. It's an reversed relation, there are many employees attached so you can't query it like that.

But there is something called related_name in django foreign keys, with use of that, your query should look like that:

    assetlist = Asset.objects.filter(organisation__employee_set__user=self.request.user)

or if you specify your own related_name into employee -> organisation relation:

clientID = models.ForeignKey(Organisation, related_name="employees")

it will look like this:

    assetlist = Asset.objects.filter(organisation__employees__user=self.request.user)

答案是从另一个模型接近,如下所示:

assetlist = Sensor.objects.filter(asset__organisation__employee__user=self.request.user)

You have written wrong code. You want an Asset object by using:

assetlist = Asset.objects.filter(organisation__employee__user=self.request.user)

But you clearly can see in your models.py that there is no relationship between Organisation and Employee , then how can you get a result using organisation__employee... ?

You should first create a ForeignKey field to relate with Employee model then your code will work fine.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM