我想從 REST API 獲取用戶名。我得到了 ID,但沒有得到用戶名。這是我的 serializer.py
class OfferSeriaLizer(serializers.ModelSerializer):
class Meta:
model = Offer
fields = ['id', 'offer_title', 'image', 'user', 'click', 'category']
這是我的模型
class Offer(models.Model):
Offer_STATUS = (
("ACTIVE", "ACTIVE"),
("PENDING APPROVAL", "PENDING APPROVAL"),
("REQUIRED MODIFICATION", "REQUIRED MODIFICATION"),
("DENIED", "DENIED"),
("PAUSED", "PAUSED"),
)
slug = models.SlugField(unique=True, null=True)
user = models.ForeignKey(User, null=True, on_delete=models.CASCADE)
offer_title = models.CharField(max_length=240)
seo_title = models.CharField(max_length=60, null=True)
image = models.ImageField(upload_to='images/')
extra_images = models.ManyToManyField(ExtraImage, blank=True)
offer_video = models.FileField(upload_to="images/", blank=True, null=True)
document = models.FileField(upload_to="files/", null=True, blank=True)
service = models.ForeignKey(Services, on_delete=models.CASCADE, null=True)
category = models.ForeignKey(Category, on_delete=models.CASCADE, null=True, related_name="offers")
sub_category = models.ForeignKey(Subcategory, on_delete=models.CASCADE, null=True, blank=True)
child_subcategory = models.ForeignKey(ChildSubcategory, on_delete=models.CASCADE, null=True, blank=True)
packages = models.ManyToManyField(Package, through='OfferManager')
description = models.TextField()
# offer_rating = models.FloatField(default=0)
is_popular = models.BooleanField(default=False, null=True)
pop_web = models.BooleanField(default=False, null=True, blank=True)
is_pro = models.BooleanField(default=False, null=True)
click = models.PositiveIntegerField(null=True, blank=True, default=0)
impressions = models.PositiveIntegerField(default=0, null=True, blank=True)
order_count = models.PositiveIntegerField(default=0, null=True, blank=True)
cancellation = models.PositiveIntegerField(default=0, null=True, blank=True)
offer_status = models.CharField(max_length=200, null=True, choices=Offer_STATUS, default="PENDING APPROVAL")
is_premium = models.BooleanField(default=False)
is_bronze = models.BooleanField(default=False, null=True)
bronze_created = models.DateTimeField(null=True, blank=True)
is_silver = models.BooleanField(default=False, null=True)
silver_created = models.DateTimeField(null=True, blank=True)
is_gold = models.BooleanField(default=False, null=True)
gold_created = models.DateTimeField(null=True, blank=True)
is_pending = models.BooleanField(null=True, blank=True, default=True)
created_at = models.DateTimeField(auto_now_add=True, null=True)
# From Admin Side
has_checked = models.BooleanField(default=False)
already_clicked = models.BooleanField(default=False)
# Pointing Sytem DB
points = models.PositiveIntegerField(null=True, default=0)
這是我的觀點
class OfferApiView(APIView):
def get(self, request):
offers = Offer.objects.filter(offer_status="ACTIVE")
serializer = OfferSeriaLizer(offers, many=True)
return Response(serializer.data)
從我的顫振方面來看,這是我的 API 服務代碼
import 'dart:convert';
import 'package:flutter/cupertino.dart';
import 'package:http/http.dart' as http;
import 'package:marketage_v2/models/offer_model.dart';
class OfferController with ChangeNotifier {
List<OfferModel> _offers = [];
Future<bool> getOffers() async {
var url = Uri.parse("https://marketage.io/api/offers/");
try {
http.Response response = await http.get(url);
var data = json.decode(response.body) as List;
List<OfferModel> temp = [];
for (var element in data) {
OfferModel offermodel = OfferModel.fromJson(element);
temp.add(offermodel);
}
_offers = temp;
notifyListeners();
return true;
} catch (e) {
return false;
}
}
List<OfferModel> get offers {
return [..._offers];
}
OfferModel offerDetails(id) {
return _offers.firstWhere((element) => element.id == id);
}
}
這是我的顫振模型
class OfferModel {
late int id;
late String offerTitle;
late String image;
late int category;
late int user;
late int click;
OfferModel(
{required this.id,
required this.offerTitle,
required this.image,
required this.category,
required this.user,
required this.click});
OfferModel.fromJson(Map<String, dynamic> json) {
id = json['id'];
offerTitle = json['offer_title'];
image = json['image'];
category = json['category'];
user = json['user'];
click = json['click'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['offer_title'] = this.offerTitle;
data['image'] = this.image;
data['category'] = this.category;
data['user'] = this.user;
data['click'] = this.click;
return data;
}
}
這是我的設計代碼
// ignore: import_of_legacy_library_into_null_safe
// ignore_for_file: avoid_unnecessary_containers, sized_box_for_whitespace
import 'package:carousel_pro/carousel_pro.dart';
import 'package:flutter/material.dart';
import 'package:marketage_v2/controllers/offer_controller.dart';
import 'package:marketage_v2/screens/basic.dart';
import 'package:marketage_v2/screens/premium.dart';
import 'package:marketage_v2/screens/standard.dart';
import 'package:marketage_v2/widgets/offer_card.dart';
import 'package:provider/provider.dart';
import 'package:smooth_star_rating/smooth_star_rating.dart';
class OfferDetails extends StatelessWidget {
static const routeName = "/offer-details";
const OfferDetails({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
final id = ModalRoute.of(context)!.settings.arguments;
// final offer_details =
// Provider.of<OfferController>(context).offerDetails(id);
final offers = Provider.of<OfferController>(context).offerDetails(id);
final offer = Provider.of<OfferController>(context).offers;
return Scaffold(
backgroundColor: const Color(0xFFe6e6e6),
body: ListView(
children: [
Container(
height: 200,
width: double.infinity,
child: Card(
elevation: 2,
child: Carousel(
dotBgColor: Colors.transparent,
dotSize: 0.0,
autoplay: true,
animationDuration: const Duration(milliseconds: 2000),
images: [
Image.network("https://marketage.io/${offers.image}"),
],
),
),
),
Container(
height: 5,
),
Container(
height: 60,
width: double.infinity,
child: Card(
elevation: 2,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Column(
children: [
Container(
child: Row(
children: [
// Container(
// padding: const EdgeInsets.only(top: 5, left: 10),
// child: CircleAvatar(
// radius: 20,
// backgroundColor: Color(0xFFe6e6e6),
// backgroundImage:
// Image.network("src"),
// ),
// ),
Container(
padding: const EdgeInsets.only(left: 10, top: 5),
child: Text(
"${offers.user}",
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
),
],
),
),
],
),
Container(
width: 197,
padding: const EdgeInsets.only(right: 10),
// color: Colors.amber,
alignment: Alignment.centerRight,
child: const Text(
"Lvl 2",
style: TextStyle(
fontSize: 17,
fontWeight: FontWeight.w500,
color: Colors.black54,
),
),
),
],
),
),
),
Container(
height: 5,
),
Container(
color: Colors.white,
height: 40,
child: const DefaultTabController(
length: 3,
child: TabBar(
indicatorColor: Color(0xFF0099ff),
labelColor: (Colors.black),
unselectedLabelColor: Color(0xff0099ff),
tabs: [
Tab(
child: Text(
'Basic',
style: TextStyle(
fontSize: 20,
),
),
),
Tab(
child: Text(
'Standard',
style: TextStyle(
fontSize: 20,
),
),
),
Tab(
child: Text(
'Premium',
style: TextStyle(
fontSize: 20,
),
),
),
],
),
),
),
// const TabBarView(
// children: [
// Basic(),
// Standard(),
// Premium(),
// ],
// ),
Container(
height: 5,
),
Container(
child: Card(
elevation: 2,
child: Column(
children: [
Container(
padding: const EdgeInsets.all(7),
alignment: Alignment.center,
child: const Text(
"I will design and develop fully customized website",
style: TextStyle(
fontSize: 22,
fontWeight: FontWeight.bold,
),
),
),
Container(
height: 1,
color: const Color(0xFFd9d9d9),
),
Container(
padding: const EdgeInsets.all(7),
child: const Text(
"I am a professional Senior Front End developer as a PSD2HTML expert with 5 years of experience In my Five years of career, I have completed more than 300 projects in different languages and frameworks. I have a strong grip as a Front End developer on HTML5, CSS3, Bootstrap4, Jquery, Javascript, SASS, React. if you want to convert your (psd to html, xd to html, sketch to html, psd to wordpress, psd to react), then you are at the right places and we can discuss the work and continue.",
style: TextStyle(
fontSize: 18,
),
),
),
Container(
height: 15,
),
],
),
),
),
Container(
height: 5,
),
Container(
width: double.infinity,
child: Card(
elevation: 3,
child: Column(
children: [
Container(
padding: const EdgeInsets.only(top: 20),
// alignment: Alignment.center,
child: const Text(
"About This Seller",
style: TextStyle(
fontSize: 22,
fontWeight: FontWeight.w500,
),
),
),
Container(
height: 15,
),
Container(
child: const CircleAvatar(
radius: 50,
backgroundColor: Color(0xFFededed),
backgroundImage: AssetImage("images/tsunade.png"),
),
),
Container(
height: 15,
),
Container(
child: const Text(
"Sakib Ovi Chan",
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
),
),
),
Container(
height: 15,
),
Container(
// padding: const EdgeInsets.fromLTRB(65, 0, 0, 0),
child: SmoothStarRating(
isReadOnly: false,
size: 40,
filledIconData: Icons.star,
halfFilledIconData: Icons.star_half,
defaultIconData: Icons.star_border,
starCount: 5,
allowHalfRating: true,
spacing: 1,
color: Colors.amber,
borderColor: const Color(0xFFff6666),
),
),
Container(
height: 15,
),
Container(
alignment: Alignment.center,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
minimumSize: const Size(250, 40),
// textStyle: const TextStyle(fontSize: 25),
primary: const Color(0xFF63b9eb),
onPrimary: const Color(0xFFffffff),
),
child: const Text(
"Contact Me",
style: TextStyle(
fontSize: 22,
// fontWeight: FontWeight.bold,
color: Color(0xFFffffff),
),
),
onPressed: () {},
),
),
Container(
height: 20,
),
Container(
padding: const EdgeInsets.only(left: 25, right: 25),
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Container(
child: const Text(
"From",
style: TextStyle(
fontSize: 20,
color: Colors.black54,
),
),
),
Container(
child: const Text(
"Member Since",
style: TextStyle(
fontSize: 20,
color: Colors.black54,
),
),
),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Container(
child: const Text(
"Bangladesh",
style: TextStyle(
fontSize: 20,
color: Colors.black,
),
),
),
Container(
child: const Text(
"Mar.07, 2021",
style: TextStyle(
fontSize: 20,
color: Colors.black,
),
),
),
],
),
],
),
),
Container(
height: 10,
),
],
),
),
),
Container(
child: Card(
elevation: 3,
child: Column(
children: [
Container(
padding: const EdgeInsets.only(top: 15),
alignment: Alignment.center,
child: const Text(
"My Project",
style: TextStyle(
fontSize: 23,
fontWeight: FontWeight.bold,
),
),
),
Container(
height: 15,
),
Container(
alignment: Alignment.center,
child: Column(
children: [
Container(
child: const Text(
"gngbd.com",
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.w500,
),
),
),
Container(
child: const Text(
"marketage.io",
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.w500,
),
),
),
Container(
child: const Text(
"mustaqeem.com",
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.w500,
),
),
),
Container(
child: const Text(
"urbandokan.com",
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.w500,
),
),
),
Container(
child: const Text(
"flashoff.com",
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.w500,
),
),
),
Container(
child: const Text(
"stackclone.com",
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.w500,
),
),
),
Container(
child: const Text(
"bloggy.com",
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.w500,
),
),
),
Container(
height: 10,
),
],
),
),
],
),
),
),
// const Expanded(
// child: TabBarView(
// children: [
// Basic(),
// Standard(),
// Premium(),
// ],
// ),
// ),
// const TabBarView(
// children: [
// Basic(),
// Standard(),
// Premium(),
// ],
// ),
Container(
height: 10,
),
],
),
);
}
}
這是我想顯示用戶名的地方
Container(
padding: const EdgeInsets.only(left: 10, top: 5),
child: Text(
"${offers.user}",
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
),
),
),
我怎樣才能從這個代碼中獲取用戶名。我需要改進代碼或 API 嗎?我怎樣才能得到我的用戶名??
uj5u.com熱心網友回復:
您無法訪問用戶名,因為在您的模型中用戶被假定為 int,而您的 API 為用戶回傳一個物件,而用戶名在此物件內。類別也是如此。要生成 dart 模型,最簡單的方法是使用 json 到 dart 轉換器。這個也支持空安全:https : //www.jsontodart.in/
這是此站點為您的 API 回傳的 json 生成的模型:
class OfferModel {
OfferModel({
required this.id,
required this.offerTitle,
required this.image,
required this.user,
required this.click,
required this.category,
});
late final int id;
late final String offerTitle;
late final String image;
late final User user;
late final int click;
late final Category category;
OfferModel.fromJson(Map<String, dynamic> json) {
id = json['id'];
offerTitle = json['offer_title'];
image = json['image'];
user = User.fromJson(json['user']);
click = json['click'];
category = Category.fromJson(json['category']);
}
Map<String, dynamic> toJson() {
final _data = <String, dynamic>{};
_data['id'] = id;
_data['offer_title'] = offerTitle;
_data['image'] = image;
_data['user'] = user.toJson();
_data['click'] = click;
_data['category'] = category.toJson();
return _data;
}
}
class User {
User({
required this.id,
required this.password,
required this.lastLogin,
required this.isSuperuser,
required this.username,
required this.firstName,
required this.lastName,
required this.email,
required this.isStaff,
required this.isActive,
required this.dateJoined,
required this.groups,
required this.userPermissions,
});
late final int id;
late final String password;
late final String lastLogin;
late final bool isSuperuser;
late final String username;
late final String firstName;
late final String lastName;
late final String email;
late final bool isStaff;
late final bool isActive;
late final String dateJoined;
late final List<dynamic> groups;
late final List<dynamic> userPermissions;
User.fromJson(Map<String, dynamic> json) {
id = json['id'];
password = json['password'];
lastLogin = json['last_login'];
isSuperuser = json['is_superuser'];
username = json['username'];
firstName = json['first_name'];
lastName = json['last_name'];
email = json['email'];
isStaff = json['is_staff'];
isActive = json['is_active'];
dateJoined = json['date_joined'];
groups = List.castFrom<dynamic, dynamic>(json['groups']);
userPermissions = List.castFrom<dynamic, dynamic>(json['user_permissions']);
}
Map<String, dynamic> toJson() {
final _data = <String, dynamic>{};
_data['id'] = id;
_data['password'] = password;
_data['last_login'] = lastLogin;
_data['is_superuser'] = isSuperuser;
_data['username'] = username;
_data['first_name'] = firstName;
_data['last_name'] = lastName;
_data['email'] = email;
_data['is_staff'] = isStaff;
_data['is_active'] = isActive;
_data['date_joined'] = dateJoined;
_data['groups'] = groups;
_data['user_permissions'] = userPermissions;
return _data;
}
}
class Category {
Category({
required this.id,
required this.slug,
required this.title,
required this.icon,
required this.subcategory,
});
late final int id;
late final String slug;
late final String title;
late final String icon;
late final List<int> subcategory;
Category.fromJson(Map<String, dynamic> json) {
id = json['id'];
slug = json['slug'];
title = json['title'];
icon = json['icon'];
subcategory = List.castFrom<dynamic, int>(json['subcategory']);
}
Map<String, dynamic> toJson() {
final _data = <String, dynamic>{};
_data['id'] = id;
_data['slug'] = slug;
_data['title'] = title;
_data['icon'] = icon;
_data['subcategory'] = subcategory;
return _data;
}
}
之后,您可以使用offers.user.username來獲取用戶名。
另外我不是后端專家,但最好從用戶物件中省略密碼,即使它是散列的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/400875.html
