Соотнести одно поле модели с другим полем модели дважды 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), когда делаю это. Как лучше всего это сделать?
При создании этого отношения внешнего ключа будет осуществляться обратный поиск от location к transfer, по умолчанию названный 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 определяет имя обратного отношения от модели User обратно к вашей модели.
Если вы не указываете имя related_name, Django автоматически создает его, используя имя вашей модели с суффиксом _set, например User.map_set.all().
Если вы укажете. related_name=maps в модели User, User.map_set все равно будет работать, но синтаксис User.maps. очевидно немного чище и менее громоздкий; так, например, если у вас есть объект пользователя current_user, вы можете использовать current_user.maps.all(), чтобы получить все экземпляры вашей модели Map, которые имеют отношение к current_user.
Надеюсь, это поможет!!!