【问题标题】:Django self-referential class for most similar car大多数类似汽车的 Django 自引用类
【发布时间】:2016-11-24 12:55:36
【问题描述】:

假设我有一个类Car,其中包含许多描述其功能的字段。我使用 {{ object.price }} 等在我的 html 中调用并显示这些功能。

通过最近邻算法,我计算出每辆车最相似的汽车列表,并希望能够显示例如五辆最相似汽车的特征。 我应该在课堂上为most_similar_cars 使用哪种字段?请注意,关系不是对称的。 IE。虽然汽车 B 可能是汽车 A 的最近邻居,但汽车 A 不一定是汽车 B 的最近邻居。我还需要能够区分最相似、第二相似、第三相似等。

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

我真的希望有人可以提供帮助。非常感谢。

【问题讨论】:

    标签: python django python-3.x django-models django-templates


    【解决方案1】:

    您可能需要具有自定义关系模型的不对称 M2M 来订购最近的汽车。 在你的情况下:

    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',)
    

    然后你可以像这样添加关系:

    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)
    

    Django 文档中的更多信息:https://docs.djangoproject.com/en/1.9/ref/models/fields/#django.db.models.ManyToManyField.symmetrical

    【讨论】:

    • 您可能还想在直通模型上添加一些unique_together 约束。
    • @solarissmoke 你能解释一下为什么以及怎么做吗?我的理解是 ManyToManyField 不能包含在 unique_together 中。
    • @Wessi 我的意思是你应该在 through 模型本身中添加一些 unique_together 约束,例如 ('car', 'close_car', 'order') 以确保排名是唯一的。
    • @mikhail-pyrev 非常感谢您的出色回答。你能解释一下如何在模板中访问最近的汽车的特征吗?
    • 如果我没听错,就遍历most_similar:<ul>{% for car in object.most_similar.all %} <li>{{ car.car_model }}</li> {% endfor %}</ul>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 2014-03-15
    相关资源
    最近更新 更多