Есть ли лучший способ обновить все строки отношения с отношением `ForegnKey` в `Django ORM`.

У меня есть две модели, одна из которых выглядит так:

class PhysicalSensor(models.Model):
    name = models.CharField(unique=True, max_length=255)

    def __str__(self) -> str:
        return self.name

class Sensor(models.Model):
    physical_sensor = models.ForeignKey(PhysicalSensor, on_delete=models.RESTRICT, null=True, blank=True)

Итак, когда я хочу добавить PhisycalSensor запись, я хочу установить Sensor записи на нее. Сейчас я делаю это в классе Serializer:


class PhysicalSensorSerializer(ModelSerializer):
    sensors = SensorSerialiazer(required=False, many=True)

    class Meta:
        fields = ("__all__")
        model = PhysicalSensor

    def create(self, validated_data):
        sensors = validated_data.pop("sensors")
        ph_sensor = super().create(validated_data)

        for sensor in sensors:
            s = Sensor.objects.get(sensor["id"])
            s.physical_sensor = ph_sensor
            s.save()

и для редактирования PhysicalSensor я использую то же самое в методе .update() моего Serializer.

Есть ли какой-нибудь бестелесный способ сделать это или лучшая практика для этого?

Лучше всего использовать метод queryset.update:

 def create(self, validated_data):
    sensors = validated_data.pop("sensors")
    ph_sensor = super().create(validated_data)

    ids = (sensor["id"] for sensor in sensors)
    Sensor.objects.filter(pk__in = ids).update(physical_sensor=ph_sensor)

больше здесь: https://docs.djangoproject.com/en/5.0/ref/models/querysets/#update

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