私は、循環輸入は「コードの匂い」であり、基本的には悪い設計選択であることを読んだ。私はモデル、ユーザー、デッキ、手を持っているアプリを持っています。デッキの作成を必要とせずにユーザーがハンドを作成できるようにしたいと思っていますが、必要に応じてデッキに手を入れる選択もユーザーに与えてください。だから私はこのようなもので終わる:モデル間でこのDjango/DRFシリアル化関係を「きれいに」作成するにはどうすればよいですか?
(<がForeignKeyの関係を意味する)
ユーザー<デッキ<手
& &
ユーザー<デッキ
& &
ユーザー<手
models.py:
class User(AbstractUser):
pass
class Deck(models.Model):
created = models.DateTimeField(auto_now_add=True)
name = models.CharField(max_length=100, unique=True,
blank=False, null=False)
user = models.ForeignKey('users.User', related_name='decks',
on_delete=models.CASCADE, null=False)
class Hand(models.Model):
created = models.DateTimeField(auto_now_add=True)
deck = models.ForeignKey('goals.Deck', related_name='hands', on_delete=models.CASCADE, null=True)
name = models.CharField(max_length=100, blank=False, null=False)
user = models.ForeignKey('users.User', related_name='hands', on_delete=models.CASCADE, null=False)
serializers.py:
class HandSerializer(serializers.HyperlinkedModelSerializer):
user = serializers.ReadOnlyField(source='user.username')
deck = serializers.CharField(required=False, source='deck.name')
class Meta:
model = Hand
fields = ('url', 'id', 'created',
'deck', 'name', 'user')
extra_kwargs = {
'url': {
'view_name': 'goals:hand-detail',
}
}
class DeckSerializer(serializers.HyperlinkedModelSerializer):
user = serializers.ReadOnlyField(source='user.username')
hands = HandSerializer(many=True, read_only=True)
class Meta:
model = Deck
fields = ('url', 'id', 'created', 'name', 'user')
extra_kwargs = {
'url': {
'view_name': 'goals:deck-detail',
}
}
class UserSerializer(serializers.HyperlinkedModelSerializer):
decks = DeckSerializer(many=True)
hands = HandSerializer(many=True)
...
が、これは私がアプリを望むものを達成するために、正しいアプローチAPI-デザインが賢明です-design-wise?そうでない場合は、どうすればこの作業を行うべきですか?もしそうならば、ユーザーをReadOnlyFieldからUserSerializer()フィールドに変更すると、循環インポートエラーを回避するにはどうすればよいですか?
編集:
ユーザー - >デッキ - >ハンド:
私はこのアプローチは、円形の輸入品と不良または不可能であったならば、私はのような標準的な一方向の関係を作成することができます考えていました
デフォルトのデッキを持っていますので、デッキはデフォルトで既に行われているため(隠されているため)、デッキを作成せずにハンドを作成することができます。しかし、これはあまりにもハックのように感じ、このアプローチが初期よりも多くのにおいをするかどうかはわかりません。