0

私は、循環輸入は「コードの匂い」であり、基本的には悪い設計選択であることを読んだ。私はモデル、ユーザー、デッキ、手を持っているアプリを持っています。デッキの作成を必要とせずにユーザーがハンドを作成できるようにしたいと思っていますが、必要に応じてデッキに手を入れる選択もユーザーに与えてください。だから私はこのようなもので終わる:モデル間でこの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()フィールドに変更すると、循環インポートエラーを回避するにはどうすればよいですか?

編集:

ユーザー - >デッキ - >ハンド:

私はこのアプローチは、円形の輸入品と不良または不可能であったならば、私はのような標準的な一方向の関係を作成することができます考えていました

デフォルトのデッキを持っていますので、デッキはデフォルトで既に行われているため(隠されているため)、デッキを作成せずにハンドを作成することができます。しかし、これはあまりにもハックのように感じ、このアプローチが初期よりも多くのにおいをするかどうかはわかりません。

答えて

1

これは正しいです。 ID 1のハンドを要求したいと仮定します。私は/ api/hands/1のGET要求をしますか?私は本当にそのユーザーのすべての手で完全なユーザーをシリアル化することを期待していますか?多分。それは単に依存しています。

MinimalUserSerializer - Returns only email, username, and ID. - Does not return hands.

そして、あなたが代わりに手にすべての時間を返しますあなたの完全なUserSerializerのものを使用します。あなたのようなものを定義し、それを回避するために

関連する問題