Thank you Derek for the information. For those that are having similar
problems this is the solution that worked for me based on Derek's lead....
## METHOD 1 ##
# view
def position_view(request):
packet_data = TncData.objects.exclude(lat=0).order_by('-dt_heard')[:100]
# loop through query set and add new dictionary key-value pair
for row in packet_data:
row.distance = row.lat*row.lon # example only of calculation only
not real
return render(request, 'main/position.html',
{'packet_data':packet_data,})
# html template snippet
{% for row in packet_data %}
<tr class='atable'>
<td class='atable'>{{row.callsign}}</td>
<td class='atable'>{{row.lat|floatformat:2}} N
{{row.lon|floatformat:2}} W </td>
<td class='atable'
style='text-align:right;'>{{row.distance|floatformat:1}} miles</td>
<td class='atable'
style='text-align:right;'>{{row.bearing|floatformat:0}} deg</td>
<td class='atable' style='padding-left:20px;'>{{row.dt_heard|date:"D
m/d H:i"}}</td>
</tr>
{% endfor %}
## METHOD 2 use @property in the model.py file
# Put the data calculations in the model.py file
class TncData(models.Model):
callsign = models.TextField(max_length=20)
lat = models.FloatField(null=True, blank=True, default=None)
lon = models.FloatField(null=True, blank=True, default=None)
path = models.TextField(max_length=250)
message = models.TextField(max_length=250)
dt_heard = models.DateTimeField(auto_now_add=False)
def __str__(self):
return str(self.callsign)
## HAVERSINE FORMULA
@property
def calculate_distance(self):
# Variables
r = 6371 # radius earth km
lat_1 = radians(42.97)
lon_1 = radians(89.77)
lat_2 = radians(self.lat)
lon_2 = radians(self.lon)
dlat = lat_1 - lat_2
dlon = lon_1 - lon_2
a = sin(dlat / 2)**2 + cos(lat_1) * cos(lat_2) * sin(dlon / 2)**2
c = 2 * asin(sqrt(a))
distance_km = c*r
distance = distance_km * 0.621
return(distance)
# html template snippet
{% for row in packet_data %}
<tr class='atable'>
<td class='atable'>{{row.callsign}}</td>
<td class='atable'>{{row.lat|floatformat:2}} N
{{row.lon|floatformat:2}} W </td>
<td class='atable'
style='text-align:right;'>{{*row.calculate_distance|*floatformat:1}}
miles</td>
<td class='atable'
style='text-align:right;'>{{row.bearing|floatformat:0}} deg</td>
<td class='atable' style='padding-left:20px;'>{{row.dt_heard|date:"D
m/d H:i"}}</td>
</tr>
{% endfor %}
On Wednesday, July 21, 2021 at 5:01:02 PM UTC-5 [email protected] wrote:
> Thanks Derek. I'll give it a try
>
> On Wednesday, July 21, 2021 at 8:55:08 AM UTC-5 Derek wrote:
>
>> See:
>> https://stackoverflow.com/questions/54412377/adding-values-to-django-queryset
>>
>>
>> VIEW
>>
>> def position_view(request):
>>
>> packet_data =
>> TncData.objects.exclude(lat=0).order_by('-dt_heard')[:100]
>> for packet in packet_data:
>> *# my complex math calculation*
>> * packet.distance = "# complex math formula using packet.lat and
>> packet.lon"*
>>
>> return render(
>> request,
>> 'main/position.html',
>> {'packet_data': packet_data, 'distance': distance})
>>
>> TEMPLATE
>>
>> *# suggest you use a better term than "field" => maybe "record"?*
>> {% for field in packet_data %}
>> <tr class='atable'>
>> <td class='atable'>{{field.callsign}}</td>
>> <td class='atable'>{{field.lat|floatformat:2}} N
>> {{field.lon|floatformat:2}} W </td>
>> <td class='atable'></td>
>> *<td class='atable'>{{field.distance}}</td>*
>>
>>
>> HTH!
>>
>> On Tuesday, 20 July 2021 at 22:25:04 UTC+2 [email protected] wrote:
>>
>>> Hello,
>>>
>>> I am trying to perform a complex math calculation from a django query
>>> set. How can I pass the results to the template for display? Annotations
>>> won't work since the math is not a simple sum, diff or average.
>>>
>>> MODEL
>>>
>>> class TncData(models.Model):
>>> callsign = models.TextField(max_length=20)
>>> lat = models.FloatField(null=True, blank=True, default=None)
>>> lon = models.FloatField(null=True, blank=True, default=None)
>>> path = models.TextField(max_length=250)
>>> message = models.TextField(max_length=250)
>>> dt_heard = models.DateTimeField(auto_now_add=False)
>>>
>>> def __str__(self):
>>> return str(self.callsign)
>>>
>>> VIEW
>>>
>>> def position_view(request):
>>>
>>> packet_data =
>>> TncData.objects.exclude(lat=0).order_by('-dt_heard')[:100]
>>>
>>> *# my complex math calculation*
>>> * # need to do something like append distance to packet_data like
>>> packet_data.distance*
>>>
>>> * distance = "# complex math formula using packet_data.lat and
>>> packet_data.lon"*
>>>
>>> return render(request, 'main/position.html',
>>> {'packet_data':packet_data,})
>>>
>>> TEMPLATE
>>>
>>> {% for field in packet_data %}
>>>
>>> <tr class='atable'>
>>> <td class='atable'>{{field.callsign}}</td>
>>> <td class='atable'>{{field.lat|floatformat:2}} N
>>> {{field.lon|floatformat:2}} W </td>
>>> <td class='atable'></td>
>>> *<td class='atable'>{{packet_data.distance}}</td>*
>>> <td class='atable'>{{field.dt_heard|date:"D m/d H:i"}}</td>
>>> </tr>
>>>
>>> {% endfor %}
>>>
>>>
>>>
--
You received this message because you are subscribed to the Google Groups
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-users/b5115c63-e000-48ee-8e5d-7f923c12731bn%40googlegroups.com.