我有一个模型,该模型从一个表中一个数据库中检索数据,以及检索其他两个表数据另外两个模型(Streets
和Cities
)。所有这些信息都需要从LandVehicle
模型中获取。我在计算如何从其他表格中检索数据到LandVehicle
模型中的属性时遇到了一些问题。下面是阶级结构我的工作:模型属性返回空
class Vehicle(models.Model):
name = models.CharField(max_length=500)
lat = models.DecimalField(max_digits=15,decimal_places=6)
lon = models.DecimalField(max_digits=15,decimal_places=6)
radius = Decimal(.06)
@abstractproperty
def streets(self):
pass
@abstractproperty
def cities(self):
pass
@cached_property
def nearby_vehicles(self):
return Vehicle.objects.filter(lat__range=[self.lat - 2, self.lat + 2], lon__range=[self.lon - 2, self.lon + 2])
# Meta
class Meta:
abstract = True
class LandVehicle(Vehicle):
@property
def streets(self):
name_substr = self.name
if " " in name_substr:
name_substr = name_substr[:name_substr.index(" ")]
return LandVehicle.objects.filter(Q(streets__name__contains=self.name) |
Q(streets__name__contains=name_substr) |
(Q(streets__lat__range=[self.lat - self.radius, self.lat + self.radius]) &
Q(streets__lon__range=[self.lon - self.radius, self.lon + self.radius])))
@property
def cities(self):
name_substr = self.name
if " " in name_substr:
name_substr = name_substr[:name_substr.index(" ")]
return LandVehicle.objects.filter(Q(cities__name__contains=self.name) |
Q(cities__name__contains=airport_name_substr) |
(Q(cities__lat__range=[self.lat - self.radius, self.lat + self.radius]) &
Q(cities__lon__range=[self.lon - self.radius, self.lon + self.radius])))
# Meta
class Meta:
db_table = 'landvehicles'
class Streets(models.Model):
# Meta
class Meta:
db_table = 'streets'
class Cities(models.Model):
# Meta
class Meta:
db_table = 'cities'
我不一定得到它的成立,现在的方式错误,但在访问视图中的数据,如vehicle.streets
,如果vehicle
是LandVehicle
的实例只是一个空变量。
我明白,我需要解析的数据,一旦我能找回它,但现在它似乎并没有被检索任何东西(不能为它打印出来东西要么)。
编辑/更新:
通过添加self
参数,每个属性(上述改变),我收到一个错误:
Cannot resolve keyword 'streets' into field. Choices are: id, lat, lon, name
至少我得到了一些错误,现在,但我仍然不确定如何访问属性。
通过空的变量,你的意思是'None'?尝试在那里放置一些'print'来查看代码是否被执行。此外,代码看起来很奇怪 - 你的方法在任何地方都缺少“self”(作为第一个参数)。 – yedpodtrzitko
@yedpodtrzitko如果我尝试在属性中打印文本到控制台(例如在“streets()'属性中打印”Test“),它会起作用,所以它似乎被执行,但如果我在属性到一个变量和打印,没有什么打印到控制台。我已将缺少的'self'参数添加到每个属性中,并更新了有关该错误的更多信息。 – swiftsly