Как получить отложенное значение атрибута?

#python #django

#python #django

Вопрос:

Мне нужно сравнить два значения ID, чтобы увидеть, совпадают ли они. В этой базе данных есть области и местоположения внутри них. Мне нужно проверить, какие местоположения находятся в определенной области. Области имеют идентификатор в качестве первичного ключа, а местоположения содержат внешний ключ, указывающий на область.

     if obj.area.id == self.id:
  

По какой-то причине внешний ключ всегда возвращает правильные значения, в то время как self.id (находится внутри класса Area) всегда возвращает <django.db.models.query_utils.DeferredAttribute object at 0x03506B70> . Я пытался Area.id , Area.pk , Area._get_pk_val , и все, используя self вместо Area. Как мне извлечь значение из отложенного атрибута?

     class Area(models.Model):
        id = models.IntegerField(default=0, primary_key=True)
        name = models.CharField(max_length=30)
        longitude = models.FloatField(default=0)
        latitude = models.FloatField(default=0)

        def __str__(self):
            return self.name

        def number_of_locations(self):
            count=0
            measurements.objects
            for obj in Location.objects.all():
                print (str(obj.area.id) " vs " str(self.id))
                if obj.area.id == self.id:
                    print("check")
                    count =1
            return count
  

РЕДАКТИРОВАТЬ: Наконец-то это заработало. Теперь он проверяет все области вместо той, в которой он находится в данный момент, и возвращает массив всех значений местоположения. Это не то, что я изначально предполагал, но это сработает.

         def number_of_locations(self):
        count_array = []
        count=0
        for a in Area.objects.all():
            for obj in Location.objects.all():
                #print (str(obj.area.id) " vs " str(a.id))
                if obj.area.id == a.id:
                    print("check")
                    count =1
            count_array.append(count)
            count=0
        return count_array
  

Комментарии:

1. вы запрашиваете id в self.id ?

2. Как мне это сделать?

3. добавьте свою функцию / класс полного просмотра

4. Я отредактировал вопрос

5. добавить к вопросу с правильно отформатированным. Этот код не читается

Ответ №1:

Вы можете проверить с помощью exists() . Он вернет true, если этот элемент существует в модели, Попробуйте это

 def number_of_locations(self):
    count = 0
    for obj in Location.objects.all():
        print(str(obj.area.id)   " vs "   str(self.id))
        if obj.area.id == Area.objects.filter(pk=obj.area.id).values_list('pk', flat=True).first():
            print("check")
            count  = 1
    return count
  

Комментарии:

1. Спасибо за ответы, но этот метод возвращает true для всех сравнений, независимо от того, равны они или нет.

2. можете ли вы проверить, obj.area.id какое значение получите

3. Повторяю, все значения внешнего ключа location верны. Неверны значения из класса Area. i.postimg.cc/6pFtmTKz/Capture.png

4. Он также возвращает все значения true.

5. Извините. Это просто выдало ошибку. QuerySet.annotate() получил невыражения: True.