У меня есть модель, что одно из полей является отношением много к одному. Я хочу дать пользователю возможность выбирать из существующих объектов модели, я пробовал много подходов к этому, включая использование SerializerMethodField и т. Д.
самое близкое, что я получил, было это:
class MissionSerializer(HyperlinkedModelSerializer):
queryset = KnownLocation.objects.all()
known_location = ChoiceField(choices=queryset, read_only=True)
gdt = KnownLocationSerializer(many=False, read_only=True)
redirect_to_knownlocation = URLField # not implented yet.
class Meta:
model = Mission
fields = ('MissionName', 'UavLatitude', 'UavLongitude', 'UavElevation', 'Area',
'gdt', 'known_location')
Который показал объекты в выборе, но не сохранил новый объект, так как это поле только для чтения.
Решение, о котором я думал, - это как-то использовать кэш Django для кэширования Каким-то образом объект KnownLocation (который также сохранит запросы) и импортирует его в сериализатор миссии и использует его в качестве выбора.
Возможно ли что-то подобное?
class Mission(models.Model):
"""
Base mission model. gdt is a KnownLocation model Object. UAV Objects are Different, they have user specified
elevation and area is not relevant to them (Contains area in the Mission object anyway). so association to
KnownLocation object would be a db and request to google api waste. We don't want to connect them to each other
or other locations, as they may be classified or subjected to more frequent changes.
"""
id = models.UUIDField(primary_key=False, default=uuid.uuid4, editable=False)
mission_name = models.CharField(name='MissionName',
verbose_name="Mission Name",
max_length=255,
blank=False,
help_text="Enter the mission's name",
unique=True,
primary_key=True # The unique field so db queries will be much faster since
# they are based on a primary key & unique field
)
uav_lat = models.FloatField(name="UavLatitude",
verbose_name="UAV Latitude",
unique=False, max_length=255, blank=False,
help_text="Enter the location's Latitude, first when extracting from Google Maps.",
default=DEFAULT_VALUE)
uav_lon = models.FloatField(name="UavLongitude",
verbose_name="UAV Longitude",
unique=False, max_length=255, blank=False,
help_text="Enter the location's Latitude, first when extracting from Google Maps.",
default=DEFAULT_VALUE)
uav_elevation = models.FloatField(name="UavElevation",
verbose_name="UAV Elevation",
max_length=100, default=1,
blank=False,
help_text="Enter the above ~Sea Level~ planned uav Elevation. "
)
area = models.CharField(name='Area',
max_length=8,
choices=AREAS, )
date_added = models.DateTimeField(verbose_name="Date Added", default=now())
gdt = models.ForeignKey(KnownLocation, on_delete=models.PROTECT, blank=True)
class Meta:
get_latest_by = 'date_added'
class KnownLocation(models.Model):
"""
Add known location to map, But also use this as Base Object to describe locations as GDTs.
:rtype Django base model for GeoLocation.
"""
name = models.CharField(name="Name",
unique=False,
primary_key=True,
max_length=150,
blank=False,
help_text="Enter the location's name")
area = models.CharField(name='Area',
max_length=8,
choices=AREAS, )
date_added = models.DateTimeField(default=timezone.now)
latitude = models.FloatField(name="Latitude",
verbose_name='Latitude',
unique=True, max_length=255, blank=False,
help_text="Enter the location's Latitude, first when extracting from Google Maps.",
)
longitude = models.FloatField(name="Longitude",
verbose_name="Longitude",
unique=True, max_length=255, blank=False,
help_text="Enter the location's Longitude, second when extracting from Google Maps.",
)
elevation = models.FloatField(name="elevation",
help_text="Enter the location's ~Sea Level~ elevation, or Leave empty for auto-fill "
"by me :). ",
verbose_name="Elevation in meters",
blank=True,
default=DEFAULT_VALUE
)