Let's say I have a class Car
with a number of fields describing its features. I call and display these features in my html using {{ object.price }}
etc.
With a nearest neighbor algorithm I have calculated a list of most similar cars for each car and would like to be able to display features of for example the five most similar cars. Want kind of field should I use for most_similar_cars
in my class? Please note that the relationship is not symmetric. Ie while car B might be the nearest neighbor of car A, car A is not necessarily the nearest neighbor of car B. I also need to be able to differentiate between the most similar, second most similar, third most etc.
models.py
from django.db import models
# Create your models here.
class Car(models.Model):
"""A model of a bureau."""
car_model = models.CharField(max_length = 50)
price = models.IntegerField(default=1)
most_similar = ?
def __str__(self):
return self.car_model
I really hope someone can help. Thank you co much.
You probably want asymmetrycal M2M with custom relation model for ordering nearest cars. In your case:
class Car(models.Model):
"""A model of a bureau."""
car_model = models.CharField(max_length = 50)
price = models.IntegerField(default=1)
most_similar = models.ManyToManyField('self', symmetrical=False, through='CarRelation')
def __str__(self):
return self.car_model
class CarRelation(models.Model):
car = models.ForeignKey(Car)
close_car = models.ForeignKey(Car, related_name='nearest_cars')
order = models.PositiveIntegerField()
class Meta:
ordering = ('order',)
Then you can add relations like this:
a = Car.objects.create(car_model='A')
b = Car.objects.create(car_model='B')
relation = CarRelation.objects.create(car=a, close_car=b, order=1)
More info in Django docs: https://docs.djangoproject.com/en/1.9/ref/models/fields/#django.db.models.ManyToManyField.symmetrical
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.