将一个模型字段与另一个模型字段关联两次 Django

Relate one model field to another model field twice Django

我正在制作库存系统,我希望能够跟踪的一件事是转移。我有两个型号

class Location(models.Model):
    class FacilityChoices(models.TextChoices):
        warehouse = 'Warehouse'
        location = 'Location'

    name = models.CharField(max_length=255, null=False, blank=False)
    street_ad = models.CharField(max_length=128, verbose_name='Street address')
    city_ad = models.CharField(max_length=128, verbose_name='City Address')
    state_prov = models.CharField(max_length=30, verbose_name='State/Province')
    country = models.CharField(max_length=50, verbose_name='Country')
    zip_code = models.CharField(max_length=20, verbose_name='Zip/Postal code')
    facility_type = models.CharField(max_length=30, choices=FacilityChoices.choices, default=FacilityChoices.warehouse)

...


class Transfer(models.Model):
    item = models.ForeignKey(Stock, on_delete=models.CASCADE)
    quantity = models.IntegerField()
    location_send = models.ForeignKey(Location, on_delete=models.CASCADE)
    location_receive = models.ForeignKey(Location, on_delete=models.CASCADE)

但是我在执行此操作时收到错误 (fields.E304)。实现此目标的最佳方法是什么?

通过创建这个外键关系,将会有一个从位置到传输的反向查找,默认情况下被django命名为“location.transfer_set”。但是有两个字段具有相同的关系名称。要解决此问题,您需要添加一个 related_name 参数来指定查找名称。

class Transfer(models.Model):
    item = models.ForeignKey(Stock, on_delete=models.CASCADE)
    quantity = models.IntegerField()
    location_send = models.ForeignKey(Location, related_name="transfer_send", on_delete=models.CASCADE)
    location_receive = models.ForeignKey(Location, related_name="transfer_receive", on_delete=models.CASCADE)

要禁用此向后关系,您可以将 related_name 设置为“+”或以“+”结尾

这个模型是你的错:-

class Transfer(models.Model):
    item = models.ForeignKey(Stock, on_delete=models.CASCADE)
    quantity = models.IntegerField()
    location_send = models.ForeignKey(Location, on_delete=models.CASCADE)
    location_receive = models.ForeignKey(Location, on_delete=models.CASCADE)

你需要更新这个:-

 class Transfer(models.Model):
        item = models.ForeignKey(Stock,related_name='Stock_item' ,on_delete=models.CASCADE)
        quantity = models.IntegerField()
        location_send = models.ForeignKey(Location,related_name='send_location', on_delete=models.CASCADE)
        location_receive = models.ForeignKey(Location,related_name='receive_location', on_delete=models.CASCADE)

在 Django 中使用的相关名称是什么

related_name 属性指定从用户模型返回到您的模型的反向关系的名称。

如果您不指定 related_name,Django 会使用您的模型名称自动创建一个后缀为 _set 的名称,例如 User.map_set.all()。

如果您指定。 related_name=用户模型上的地图,User.map_set 仍然有效,但 User.maps。语法显然更简洁、更简洁;因此,例如,如果您有一个用户对象 current_user,您可以使用 current_user.maps.all() 来获取与 current_user.

相关的地图模型的所有实例