तो मैं सोच रहा हूं कि django आराम ढांचे में अलग-अलग धारावाहिक के साथ प्रत्येक विदेशी कुंजी ऑब्जेक्ट को क्रमबद्ध करना संभव है या नहीं।

मेरा मतलब यह है की:

मेरे पास मेरे मॉडल हैं जैसे

class KingdomModel(models.Model):
    kingdom_name = models.CharField(max_length=32)
    owner = models.OneToOneField(User, on_delete=models.CASCADE)
    faction = models.CharField(max_length=10)
    

class CityModel(models.Model):
    kingdom = models.ForeignKey(KingdomModel, on_delete=models.CASCADE, related_name="cities")
    city_name = models.CharField(max_length=32)
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    """
    ... other fields aswell
    """


class ArmyModel(models.Model):
    home_city = models.ForeignKey(CityModel, on_delete=models.CASCADE, null=True, related_name="own_troops")
    current_city = models.ForeignKey(CityModel, on_delete=models.CASCADE, null=True, related_name="all_troops", blank=True)
    status = models.CharField(max_length=32)
    action_done_time = models.DateTimeField(default=None, null=True, blank=True)
    target_city = models.ForeignKey(CityModel, on_delete=models.CASCADE, null=True, related_name="incoming_troops", default=None, blank=True)

    # Shared troops
    settlers = models.IntegerField(default=0)

    # Gaul troops
    pikemen = models.IntegerField(default=0)
    swordmen = models.IntegerField(default=0)
    riders = models.IntegerField(default=0)

    # Roman troops
    legionaries = models.IntegerField(default=0)
    praetorian = models.IntegerField(default=0)


और मैं राज्यों के गुट के आधार पर सेनाओं को क्रमबद्ध करने की कोशिश कर रहा हूं। owner_troops के बारे में बात करते समय जो ठीक काम करता है क्योंकि वे हमेशा एक ही धारावाहिक के साथ क्रमबद्ध होने जा रहे हैं, जैसे।

class CitySerializer(serializers.ModelSerializer):

    own_troops = serializers.SerializerMethodField()
    incoming_troops = serializers.SerializerMethodField()

    def get_own_troops(self, city_obj):
        if(KingdomModel.objects.get(owner=city_obj.owner).faction == "Gaul"):
            return GaulTroopsSerializer(instance=city_obj.own_troops, context=self.context, many=True, required=False, read_only=False).data
        elif(KingdomModel.objects.get(owner=city_obj.owner).faction == "Roman"):
            return RomanTroopsSerializer(instance=city_obj.own_troops, context=self.context, many=True, required=False, read_only=False).data
class RomanTroopsSerializer(serializers.ModelSerializer):
    class Meta:
        model = ArmyModel
        fields = ['id', 'home_city', 'current_city', 'target_city', 'status', 'action_done_time', 'settlers', 'legionaries', 'praetorian']

class GaulTroopsSerializer(serializers.ModelSerializer):
    class Meta:
        model = ArmyModel
        fields = ['id', 'home_city', 'current_city', 'target_city', 'status', 'action_done_time', 'settlers', 'pikemen', 'swordmen', 'riders']

लेकिन अगर मैं incoming_troops को क्रमबद्ध करने के लिए उसी तर्क को लागू करने का प्रयास करता हूं, तो यह हमेशा पहले धारावाहिक के साथ सूची में सभी वस्तुओं को क्रमबद्ध करेगा। रिश्ते के अंदर डेटा के आधार पर प्रत्येक विदेशी कुंजी को अलग-अलग धारावाहिक के साथ क्रमबद्ध करने का यह मेरा निराशाजनक प्रयास था।


    def get_incoming_troops(self, city_obj):
        for data in GaulTroopsSerializer(instance=city_obj.incoming_troops, context=self.context, many=True, required=False, read_only=False).data:
            print(data)
            home_city_obj = CityModel.objects.get(id=data['home_city'])
            if(KingdomModel.objects.get(owner=home_city_obj.owner).faction == "Gaul"):
                return GaulTroopsSerializer(instance=city_obj.incoming_troops, context=self.context, many=True, required=False, read_only=False).data
            else:
                return RomanTroopsSerializer(instance=city_obj.incoming_troops, context=self.context, many=True, required=False, read_only=False).data

    class Meta:
        model = CityModel
        fields = ['id', 'owner', 'city_name', 'x_coordinate', 'y_coordinate', 'last_updated', 'max_warehouse_capacity', 'max_grain_silo_capacity', 'wood_ammount', 'wheat_ammount', 'stone_ammount', 'iron_ammount', 'resource_fields', 'buildings','incoming_troops', 'own_troops',  'all_troops']
        read_only_fields = ['id', 'max_warehouse_capacity', 'max_grain_silo_capacity']

मुझे पता है कि मेरे पास सभी अलग-अलग गुटों की सेनाओं के लिए कई मॉडल हो सकते हैं, लेकिन अभी के लिए मैं सोच रहा हूं कि क्या यह django/drf में संभव है?

0
Lauri 12 जिंदा 2021, 12:57

1 उत्तर

सबसे बढ़िया उत्तर

अपने स्वयं के प्रश्न का उत्तर देना क्योंकि मुझे यह काम कर रहा है और मैंने जो किया वह निम्नलिखित है:

सबसे पहले मैंने कई सैन्य धारावाहिकों को बिखेर दिया। और मेरे पास सिर्फ एक सेना धारावाहिक था जहां मैं गुट के अनुसार खेतों को बदल देता था।

यह अब मेरा आर्मीसेरियलाइज़र है

class ArmySerializer(serializers.ModelSerializer):
class Meta:
    model = ArmyModel
    fields = ['id', 'home_city', 'current_city', 'target_city', 'status', 'action_done_time']  
    

def to_representation(self, instance):
    try:
        del self.fields # Clear the cache
    except AttributeError:
        pass

    if("faction" in self.context and len(self.context['faction']) > 0):
        print(self.context['faction'])
        self.fields['settlers'] = serializers.IntegerField()
        if(self.context['faction'][0] == "Gaul"):
            self.fields['pikemen'] = serializers.IntegerField()
            self.fields['swordmen'] = serializers.IntegerField()
            self.fields['riders'] = serializers.IntegerField()
        elif(self.context['faction'][0] == "Roman"):
            self.fields['legionaries'] = serializers.IntegerField()
            self.fields['praetorian'] = serializers.IntegerField()
        if(len(self.context['faction']) > 1):
            self.context['faction'].pop(0)
    
    
    return super().to_representation(instance)

और सिटीसेरियलाइज़र में मैं संदर्भ ['गुट'] सूची को इस तरह से पॉप्युलेट कर रहा हूं:

class CitySerializer(serializers.ModelSerializer):

own_troops = serializers.SerializerMethodField()
incoming_troops = serializers.SerializerMethodField()


def get_own_troops(self, instance):
    if(KingdomModel.objects.get(owner=instance.owner).faction == "Gaul"):
        self.context["faction"] = ["Gaul"]
        return ArmySerializer(instance=instance.own_troops, context=self.context, many=True, required=False, read_only=False).data
    elif(KingdomModel.objects.get(owner=instance.owner).faction == "Roman"):
        self.context["faction"] = ["Roman"]
        return ArmySerializer(instance=instance.own_troops, context=self.context, many=True, required=False, read_only=False).data

def get_incoming_troops(self, city_obj):
    self.context['faction'] = []
    for data in ArmySerializer(instance=city_obj.incoming_troops, context=self.context, many=True, required=False, read_only=False).data:
        home_city = CityModel.objects.get(id=data['home_city'])
        sender_faction = KingdomModel.objects.get(owner=home_city.owner).faction
        if(sender_faction == "Gaul"):
            self.context['faction'] += ["Gaul"]
        else:
            self.context['faction'] += ["Roman"]
    return ArmySerializer(instance=city_obj.incoming_troops, context=self.context, many=True, required=False, read_only=False).data

यह भी कहा जाना चाहिए कि, POST अनुरोधों के साथ सेना बनाते समय इसने एक नई समस्या पेश की। to_representation विधि में गतिशील रूप से जोड़े गए फ़ील्ड डिफ़ॉल्ट रूप से मान्य नहीं हैं, इसलिए वे मान्य_डेटा में मौजूद नहीं हैं। सत्यापन को ओवरराइड करने का एक तरीका हो सकता है लेकिन मैंने अभी उन्हें कच्चे अनुरोध डेटा से लिया है और ऐसा लगता है कि यह ठीक काम कर रहा है।

0
balmy 22 जिंदा 2021, 23:51