小编sph*_*rak的帖子

如何使用django-rest-framework-(gis)展平外键对象

我一直在寻找一个最新且特定于我的问题的解决方案,但是还没有找到解决方案或明确的文档来说明我真正需要做的事情,以便使关系变得平坦以符合geojson.

这个问题几乎与我的问题相同,但是解决方案或答案并没有解决问题,仍然会产生无效的GeoJSON.

有关

问题

我有一个Location模型,其中包含pointfieldSRID = 4326.我也有一个TrainStation有模型location字段作为外键Location.当我序列化TrainStation经由GeoFeatureModelSerializer其产生无效GeoJSON的(参见实施例下面的"无效GeoJSON的").

(当然,如果我PointFieldTrainStation模型存储在哪里,可以获得有效的GeoJSON ,但在我的情况下,我不能这样做,所以我需要以某种方式压扁它.)

  • 如何实现输出,如下面的"Valid GeoJSON"示例?

研究

我是Python和Django的新手,因此我还不太擅长阅读其他人的源代码,但我想我可以得出结论,我需要以某种方式覆盖该to_representation()方法以获得我想要的东西,但我的搜索是如此没有结果,所以我被卡住了.

models.py

class Location(models.Model):

    point = models.PointField()

class TrainStation(models.Model):

    location_signature = models.CharField(primary_key=True, max_length=32)
    advertised_location_name = models.CharField(max_length=32)
    country_code = models.ForeignKey(Country)
    county_no = models.ForeignKey(County)
    location = models.ForeignKey(Location, null=True)
Run Code Online (Sandbox Code Playgroud)

serializers.py

class LocationSerializer(ModelSerializer):

    class Meta:
        model = Location
        geo_field = 'point'
        fields = …
Run Code Online (Sandbox Code Playgroud)

django geodjango geojson django-rest-framework django-rest-framework-gis

5
推荐指数
1
解决办法
531
查看次数

Moshi:解析单个对象或对象列表(kotlin)

我正在构建一个应用程序,该应用程序可以Warning从我无法控制的API中获取对象,也不希望它们删除我正在尝试解决的这种行为。

我希望能够解析单个Warning对象或一个List<Warning>对象。(因为如果对象列表只有1个或> 1,则API会返回1个对象。)

如何直接将对象解析为列表或使用Moshi解析此列表?

我得到的数据看起来像这样:

{
  # List<Warning>
  "warnings": [{...}, {...}]
}
Run Code Online (Sandbox Code Playgroud)

或像这样:

{
  # Warning
  "warnings": {...}
}
Run Code Online (Sandbox Code Playgroud)

我已经阅读并找到了有关此主题的一些资源,但没有示例,而且我不确定如何进行操作。因此,任何指针将不胜感激。

尝试

最初,我试着用自动生成的moshi适配器来拔号,以为我可以在其上构建它,但是我不知道发生了什么,因此它并没有真正带我到任何地方。但无论如何,我还是将生成的代码包括在内,以防它可能仍然对任务有用。

编辑:这是我目前拥有的,尽管我对Moshi实例正常工作并不满意。

工厂通用方法

自从我意识到像Eric在他的答复中指出的那样,更通用的方法更好之后,我便尝试移植Eric写给kotlin的适配器。一旦这有效,我将重新编写这篇文章的一部分,使其更易于理解,为此我为此表示歉意。

编辑:我最终在另一个线程中使用了Eric建议的解决方案,但移植到Kotlin。

带工厂适配器

class SingleToArrayAdapter(
    val delegateAdapter: JsonAdapter<List<Any>>,
    val elementAdapter: JsonAdapter<Any>
) : JsonAdapter<Any>() {

    companion object {
        val INSTANCE = SingleToArrayAdapterFactory()
    }

    override fun fromJson(reader: JsonReader): Any? =
        if (reader.peek() != JsonReader.Token.BEGIN_ARRAY) {
            Collections.singletonList(elementAdapter.fromJson(reader))
        } else delegateAdapter.fromJson(reader)

    override fun toJson(writer: JsonWriter, value: Any?) …
Run Code Online (Sandbox Code Playgroud)

android json adapter kotlin moshi

5
推荐指数
1
解决办法
2055
查看次数

有没有办法通过协程/流程/通道在 Kotlin 中实现这种接收流程?

我是第一次尝试 Kotlin 协程和 Flow,并且尝试使用 MVI 风格的方法通过 RxJava 重现我在 Android 上使用的某个流程,但我很难正确执行它,并且我基本上陷入了这一点。

RxJava 应用程序基本上如下所示:

MainActivityView.kt

object MainActivityView {

    sealed class Event {
        object OnViewInitialised : Event()
    }

    data class State(
        val renderEvent: RenderEvent = RenderEvent.None
    )

    sealed class RenderEvent {
        object None : RenderEvent()
        class DisplayText(val text: String) : RenderEvent()
    }
}
Run Code Online (Sandbox Code Playgroud)

MainActivity.kt

MainActivity 有一个PublishSubject带有Event类型的实例。即MainActivityView.Event.OnViewInitialisedMainActivityView.Event.OnError等等。初始事件是onCreate()通过受试者的.onNext(Event)呼叫发送的。

@MainActivityScope
class MainActivity : AppCompatActivity(R.layout.activity_main) {

    @Inject
    lateinit var subscriptions: CompositeDisposable

    @Inject
    lateinit var viewModel: …
Run Code Online (Sandbox Code Playgroud)

android kotlin kotlin-coroutines

5
推荐指数
1
解决办法
3125
查看次数