Соотнести одно поле модели с другим полем модели дважды 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.

Надеюсь, это поможет!!!

Вернуться на верх